WebDriverException:在Mac OS X上将WebDriver与Safari 11结合使用时,无法将返回值转换为WebElement:{}

时间:2018-06-25 09:29:02

标签: java macos selenium selenium-webdriver safari

我有一个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的特定信息没有任何显示。

有人可以帮我解决这个问题吗?

谢谢, 斯里拉姆·斯里达兰(Sriram Sridharan)

1 个答案:

答案 0 :(得分:3)

此错误消息...

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

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

但是您的主要问题如下:

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);

出了什么问题

目前尚不清楚用例为何需要获取<body>标签。但是根据以下讨论:

此错误可能有三种可能性,如下所示:

  • 页面仍在加载时,也许当某些 JavaScript / Ajax 仍处于活动状态时,您的脚本/程序试图访问<body>标签。
  • 解决方案:为要与之交互的 WebElement 生成 WebDriverWait ,如下所示:

    WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.id("elementID")));
    
  • 如果要获取页面源,请使用 getPageSource() 方法,如下所示:

    System.out.println(driver.getPageSource());
    
  • 如果在尝试找到<iframe>标记之前,程序的控件位于<body>之内,请按以下步骤切换回 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>