【问题标题】:WebDriverException: Returned value cannot be converted to WebElement: {} while using WebDriver with Safari 11 on Mac OS XWebDriverException:在 Mac OS X 上将 WebDriver 与 Safari 11 一起使用时,返回值无法转换为 WebElement:{}
【发布时间】:2018-12-03 20:05:55
【问题描述】:

我有一个 selenium webdriver 脚本,它对我的​​被测应用程序执行一些回归测试。该脚本可在 Google Chrome、Firefox、IE 等上完美运行。

但是,最近我尝试在 Mac OS X (10.13.5) 上的 Safari (11.1.1) 上运行它,即使我调用诸如

之类的简单行,我的脚本也会失败并显示一条奇怪的消息
driver.findElement(By.tagName("body"));

我得到的异常如下:

org.openqa.selenium.WebDriverException: Returned value cannot be converted to WebElement: {}
Build info: version: '3.0.1', revision: '1969d75', time: '2016-10-18 09:49:13 -0700'
System info: host: 'Yethis-MacBook-Pro.local', ip: '192.168.2.197', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.13.5', java.version: '1.8.0_171'
Driver info: driver.version: RemoteWebDriver
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:375)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByTagName(RemoteWebDriver.java:441)
    at org.openqa.selenium.By$ByTagName.findElement(By.java:334)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:360)
    at org.ycs.selenium.safari.App.execute(App.java:75)
    at org.ycs.selenium.safari.App.main(App.java:27)
Caused by: java.lang.ClassCastException: com.google.common.collect.Maps$TransformedEntriesMap cannot be cast to org.openqa.selenium.WebElement
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:373)
    ... 5 more

硒版本:3.0.1 Safari 版本:11.1.1 Java版本:1.8 OS X 版本:10.13.5

编辑: 这是我在 maven 中配置的依赖项

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-server</artifactId>
    <version>3.0.1</version>
</dependency>

我尝试对这个问题进行大量搜索,但不幸的是,没有任何关于 Mac 的特定信息出现。

谁能帮我解决这个问题?

谢谢, 斯里拉姆斯里达兰

【问题讨论】:

  • 请分享html源代码和你的attepmt。
  • 很抱歉这是一个客户端应用程序,我无法共享 HTML 源代码。但是,我可以告诉你,这个问题只发生在少数随机页面上,其余页面没有问题。但是,我已确保 iFrame、窗口句柄等方面没有问题。你能指出我正确的方向吗?
  • 从异常 StackTrace 中搜索此 Caused by: java.lang.ClassCastException: com.google.common.collect.Maps$TransformedEntriesMap cannot be cast to org.openqa.selenium.WebElement

标签: java macos selenium selenium-webdriver safari


【解决方案1】:

此错误消息...

org.openqa.selenium.WebDriverException: Returned value cannot be converted to WebElement: {}

...暗示 WebDriverException 在 JVM 试图将返回的值转换为 WebElement 时引发。

但是您的主要问题如下:

java.lang.ClassCastException: com.google.common.collect.Maps$TransformedEntriesMap cannot be cast to org.openqa.selenium.WebElement

ClassCastException

ClassCastException 被抛出以指示代码已尝试将对象强制转换为它不是实例的子类。例如,以下代码生成 ClassCastException:

Object x = new Integer(0);
System.out.println((String)x);

出了什么问题

不清楚您的用例为什么需要获取&lt;body&gt; 标签。但根据以下讨论:

此错误可能有以下三种可能:

  • 您的脚本/程序试图访问&lt;body&gt; 标记,而页面仍在加载,可能是某些JavaScript / Ajax 仍处于活动状态。
  • 解决方案:为您希望与之交互的 WebElement 引入 WebDriverWait,如下所示:

    WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.id("elementID")));
    
  • 如果你想获取Page Source,请使用getPageSource()方法如下:

    System.out.println(driver.getPageSource());
    
  • 如果程序的控件在尝试查找&lt;body&gt; 标记之前位于&lt;iframe&gt; 内,则切换回defaultContent,如下所示:

    driver.switchTo().defaultContent();
    

注意:根据最佳实践,请始终让您的测试环境更新为最新版本。

  • Selenium Client 依赖更新到3.12.0

    • selenium-java:

      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-java</artifactId>
          <version>3.12.0</version>
      </dependency> 
      
    • selenium-server:

      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-server</artifactId>
          <version>3.12.0</version>
      </dependency>
      

【讨论】:

  • 您好 Debanjan,感谢您的回复。先回答你的问题。我实际上没有捕获 标签的功能需要。这只是为了证明我无法识别页面上的任何元素,包括 body 标签。上一页中没有 iFrame,但我添加了一个 switchTo().defaultContent() 以确保。正如您提到的,我还添加了一个 WebDriverWait,但是这次 WebDriverWait 语句本身引发了上述错误。另外,我不认为它等了 20 秒。异常几乎是瞬间的。你能帮帮我吗?
猜你喜欢
  • 2018-11-01
  • 1970-01-01
  • 2016-07-26
  • 2015-02-03
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多