【问题标题】:Using EventFiringWebDriver with RemoteWQebDriver将 EventFiringWebDriver 与 RemoteWQebDriver 一起使用
【发布时间】:2020-08-13 15:57:41
【问题描述】:

我想将 EventFiringWebDriver 与 RemoteWebDriver 一起使用,因为我们使用的是 selenium 网格,而使用 WebDriver 我的代码可以正常工作,但是当我尝试将 EventFiringWebDriver 转换为 RemoteWebDriver 时,我在运行时遇到了异常。

java.lang.ClassCastException: org.openqa.selenium.support.events.EventFiringWebDriver cannot be cast to org.openqa.selenium.remote.RemoteWebDriver
    at com.sixt.test.eventfiringwebdriver.DriverFactory.getDriverInstance(DriverFactory.java:52)
    at com.sixt.test.eventfiringwebdriver.DriverFactoryTest.test1(DriverFactoryTest.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
    at org.testng.SuiteRunner.run(SuiteRunner.java:364)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
    at org.testng.TestNG.runSuites(TestNG.java:1049)
    at org.testng.TestNG.run(TestNG.java:1017)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

请帮忙。

【问题讨论】:

标签: java selenium ui-automation


【解决方案1】:

EventFiringWebDriver 不是RemoteWebDriver 的子类,所以不能直接强制转换。您需要直接使用 RemoteWebDriver 的情况非常罕见,但如果您需要事件触发包装器正在使用的驱动程序实例,则可以执行以下操作:

// Note: Assume eventDriver is a valid EventFiringWebDriver instance
// Further note: Yes, it's possible to consolidate the below into fewer lines,
// but each step is shown here for clarity.
WrapsDriver wrapperAccess = (WrapsDriver)eventDriver;
WebDriver driver = wrapperAccess.getWrappedDriver();

// If you really, really need a RemoteWebDriver instance here, you can do this
RemoteWebDriver remoteDriver = (RemoteWebDriver)driver;

【讨论】:

  • 嗨,吉姆,感谢您的回复。我尝试了您共享的代码。现在我没有收到 ClassCast 异常,但我的事件侦听器没有被调用。 EventFiringWebDriver eDriver = new EventFiringWebDriver(webDriver); eDriver.register(new WebDriverListener()); //webDriver = eDriver; WrapsDriver wrapperAccess = (WrapsDriver)eDriver; webDriver= wrapperAccess.getWrappedDriver();如果我直接将 EventFiringWebDriver 实例分配给 WenDriver 实例,则侦听器可以工作,但如果我尝试通过 WrapsDriver 进行操作,则它不起作用。
  • 或者有什么方法可以让我使用 EventFiringWebDriver 和 RemoteWebDriver。
  • @Umang 你没有说明为什么你认为你需要访问原始的RemoteWebDriver 实例,而不是使用WebDriver 接口。这也是一个与您提出的问题完全不同的问题,这就是ClassCastException 发生的原因以及如何避免它。
  • 在我们的框架中,我们使用 selenium 网格,因此我们使用 RemoteWebDriver 而不是 WebDriver,因此提出了上述问题。
  • @Umang 这无关紧要。您可以使用 Selenium Grid 和 RemoteWebDriver 并仍然使用 WebDriver 接口。无需使用具体实现;你应该使用界面。
【解决方案2】:

有时我们需要具体的实现,例如:

  • 拥有 sessionID : ((RemoteWebDriver) webdriver).getSessionId()
  • 上传文件:((RemoteWebDriver) webdriver).setFileDetector()

【讨论】:

    【解决方案3】:

    试试这个

     ((RemoteWebDriver) ((EventFiringWebDriver) this.browserContext.getDriver()).getWrappedDriver());
    

    【讨论】:

      【解决方案4】:

      它对我有用 (kotlin)

      val driver = (getWebDriver() as EventFiringWebDriver).wrappedDriver as RemoteWebDriver
      val sessionId = driver.sessionId.toString()
      

      注意:我添加了类似的监听器

      @BeforeEach
          fun beforeEach() {
              WebDriverRunner.addListener(Highlighter())
          }
      

      【讨论】:

        猜你喜欢
        • 2017-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多