我有一个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)
答案 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:
Object x = new Integer(0);
System.out.println((String)x);
目前尚不清楚用例为何需要获取<body>
标签。但是根据以下讨论:
此错误可能有三种可能性,如下所示:
<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>