我正在使用Selenium,Maven,TestNG和Java在Firefox上运行自动化测试。以前,我使用Firefox v52,gauva v21,testng v6.9.10,selenium-java v3.4.0和commons.io v2.1(来自pom.xml)。我升级到Firefox v60,这意味着更新所有依赖项。我遇到的问题是,当我运行相同的测试时(无论测试如何),它们都会失败,因为元素没有被带入视口中,这在Firefox v52中是默认完成的。我可以与该元素进行交互,例如获取文本或页面上所有元素的大小,但是我无法单击。这是对https://www.hskupin.info/2017/12/15/element-interactability-checks-with-geckodriver-and-firefox-58/发生的情况的参考。我尝试更新moz:webdriverClick,但我猜想这仅适用于Firefox v58(也许是v59)。
这是我更新的pom.xml中的依赖项
<dependency>
<groupId>com.google.com</groupId>
<artifactId>guava</artifactId>
<version>23.6-jre</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons.io</artifactId>
<version>2.1</version>
</dependency>
我的Java文件
public class Assassinate {
protected WebDriver driver;
public WebDriver getDriver() {
return driver;
}
@BeforeMethod(alwaysRun = true)
public void beforeMethod() throws Exception {
String customProfile = System.getProperty("customFirefoxProfile");
FirefoxProfile profile = new FirefoxProfile(new File(customProfile));
FirefoxOptions fo = new FirefoxOptions();
System.setProperty("webdriver.gecko.driver", "resources/geckodriver");
fo.setAcceptInsecureCerts(true);
fo.setProfile(profile);
driver = new FirefoxDriver(fo);
driver.manage()timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@AfterMethod(alwaysRun = true)
public void tearDown() throws Exception {
getDriver().quit();
TemporaryFilesystem.getDefaultTmpFS().deleteTemporaryFiles();
}
@Test (groups = {"test"})
public void firstTest () {
getDriver().get("someurl");
getDriver().findElement(By.id("id")).click();
}
}
我删除了DesiredCapabilities并更新为Firefox Options。我还将路径添加到了geckodriver。这可以使我尽可能地打开url并获得成功,但是由于它不在视野中,因此它不会单击该元素。如果选择了可见的元素,则可以单击它。我最终希望无头运行测试,但我可以停止一切。还有其他人能够解决这个问题或找到解决方法吗?我没有收到任何错误,因此没有帮助。 TIA。
答案 0 :(得分:0)
如果您使用以下 Selenium maven依赖项:
<dependency>
<groupId>com.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.11.0</version>
</dependency>
您不需要明确使用以下 guava maven依赖项:
<dependency>
<groupId>com.google.com</groupId>
<artifactId>guava</artifactId>
<version>23.6-jre</version>
</dependency>
selenium-java-3.11.0 包含 guava-23.6-jre
click()
的自动滚动要在元素上调用click()
,仅当所需元素在DOM Tree中可见时,自动滚动才会发生。
相关的HTML DOM将使我们知道所需的元素是否在HTML DOM中可见。但是,按照最佳实践,当您打开一个新页面时,在单击一个元素之前,先诱使 WebDriverwait 使其可单击所需的元素,然后可以使用以下解决方案:>
@Test (groups = {"test"})
public void firstTest () {
getDriver().get("someurl");
new WebDriverWait(getDriver(), 20).until(ExpectedConditions.elementToBeClickable(By.id("id"))).click();
}