【问题标题】:Why doesn't this code handle events from the browser?为什么这段代码不处理来自浏览器的事件?
【发布时间】:2018-01-21 12:35:24
【问题描述】:

我的代码可以打开浏览器窗口并浏览到 URL。我的代码中没有发现任何错误。我需要处理浏览器生成的事件,尤其是当用户关闭浏览器窗口时。我的 OverrideClass 中没有任何消息被捕获。

我有这个:

try {
    System.setProperty("webdriver.gecko.driver", "./geckodriver.exe");
    driver = new FirefoxDriver();

    EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
    OverrideClass oc = new OverrideClass();
    eventDriver.register(oc);
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
} catch (Exception ex) {
    Log.logError("Browser.initBrowser(): " + ex.getLocalizedMessage());
}

消息处理程序如下所示:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.events.WebDriverEventListener;

public class OverrideClass implements WebDriverEventListener{
//  @Override
//  public void afterChangeValueOf(WebElement arg0, WebDriver arg1) {
//
//  }
    @Override
    public void afterClickOn(WebElement arg0, WebDriver arg1) {
        System.out.println("OverrideClass.afterClickOn(): " + arg0.toString());
    }
    @Override
    public void afterFindBy(By arg0, WebElement arg1, WebDriver arg2) {
        System.out.println("OverrideClass.afterFindBy(): " + arg0.toString());  }
    @Override
    public void afterNavigateBack(WebDriver driver) {
        System.out.println("After clicking back  "+ driver.getCurrentUrl());
    }
    @Override
    public void afterNavigateForward(WebDriver arg0) {

    }
    @Override
    public void afterNavigateTo(String arg0, WebDriver arg1) {

    }
    @Override
    public void afterScript(String arg0, WebDriver arg1) {

    }
//  @Override
//  public void beforeChangeValueOf(WebElement arg0, WebDriver arg1) {
//
//  }
    @Override
    public void beforeClickOn(WebElement arg0, WebDriver arg1) {

    }
    @Override
    public void beforeFindBy(By arg0, WebElement arg1, WebDriver arg2) {

    }
    @Override
    public void beforeNavigateBack(WebDriver driver) {
        System.out.println("OverrideClass.beforeNavigateBack() Before clicking back: " + driver.getCurrentUrl());
    }
    @Override
    public void beforeNavigateForward(WebDriver arg0) {
        System.out.println("OverrideClass.beforeNavigateForward() Before clicking back: " + arg0.getCurrentUrl());
    }
    @Override
    public void beforeNavigateTo(String arg0, WebDriver arg1) {
        System.out.println("OverrideClass.beforeNavigateTo(): " + arg0);
    }
    @Override
    public void beforeScript(String arg0, WebDriver arg1) {

    }
    @Override
    public void onException(Throwable arg0, WebDriver arg1) {
        System.out.println("OverrideClass.onException(): " + arg0.getLocalizedMessage());
    }
    @Override
    public void afterAlertAccept(WebDriver arg0) {


    }
    @Override
    public void afterAlertDismiss(WebDriver arg0) {


    }
    @Override
    public void afterChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence[] arg2) {


    }
    @Override
    public void afterNavigateRefresh(WebDriver arg0) {


    }
    @Override
    public void beforeAlertAccept(WebDriver arg0) {


    }
    @Override
    public void beforeAlertDismiss(WebDriver arg0) {


    }
    @Override
    public void beforeChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence[] arg2) {


    }
    @Override
    public void beforeNavigateRefresh(WebDriver arg0) {


    }
}

【问题讨论】:

  • 您是通过eventDriver 加载页面吗?看来您仍然使用原始的 driver (driver.manage().timeouts()) 而不是 eventDriver 包装器。
  • EventFiringWebDriver 用于侦听通过该驱动程序上的代码启动的事件,而不是用于用户生成的事件。如果用户更改浏览器的 url,则不会在您的代码上触发任何事件。因此,只有在您对 eventDriver 对象采取操作时才会触发此事件
  • @VinceEmigh 谢谢!很好的收获。
  • @TarunLalwani 无赖。感谢您澄清这一点。 :)
  • 请阅读How to Ask,尤其是关于minimal reproducible example(MCVE)和How much research effort is expected?的部分,这将帮助您调试自己的程序并自己解决问题。如果您这样做并且仍然卡住,您可以返回并发布您的 MCVE、您尝试过的内容以及执行结果(包括任何错误消息),以便我们更好地帮助您。还提供指向页面和/或相关 HTML 的链接。

标签: java selenium


【解决方案1】:

所以 selenium 使用一系列模拟用户交互的命令,将这些命令传递给驱动程序。 Firefox 我相信有一个插件允许您通过手动浏览来创建命令,然后您可以将其泵回驱动程序以进行自动化测试。

我在上面的示例代码中没有看到任何“点击”或其他命令。有关以编程方式为驱动程序发出命令的示例,请参阅 this

【讨论】:

  • 我已经可以为驱动发出命令了,没问题。我无法让驱动程序告诉我浏览器窗口何时关闭。
  • 停止驱动相当于关闭浏览器窗口。
  • 我需要知道用户何时关闭浏览器窗口。
  • webdriver 的实例是“浏览器窗口”。您可以 (1) try this 或 (2) try this
【解决方案2】:

您必须注意以下几点:

  1. 要查看正在处理的某些浏览器事件,您需要访问一些url,例如"https://google.com"
  2. 要根据事件处理程序查看更多浏览器事件,您需要访问一些WebElement
  3. 因此,查看某些事件被触发的最小代码将是:

    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.events.EventFiringWebDriver;
    
    public class my_program 
    {
        public static void main(String[] args) 
        {
            System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
            WebDriver driver = new FirefoxDriver();
            EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
            OverrideClass oc = new OverrideClass();
            eventDriver.register(oc);
            eventDriver.get("https://google.com");
            WebElement element = eventDriver.findElement(By.linkText("Gmail"));
            element.click();
        }
    
    }
    
  4. 现在,您已经创建了一些系统输出来查看正在处理的浏览器事件,这些事件保持不变。

  5. 最后当你执行这个程序时,你会在你的控制台上看到如下输出:

    OverrideClass.beforeNavigateTo(): https://google.com
    OverrideClass.afterFindBy(): By.linkText: Gmail
    OverrideClass.afterClickOn(): [[FirefoxDriver: firefox on XP (b1412059-9499-45ff-b49a-2bc69a3ace30)] -> link text: Gmail]
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多