Selenium,Firefox和geckodriver不会自动滚动单击方法

时间:2018-12-13 15:16:28

标签: java selenium firefox geckodriver webdriverwait

我正在使用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。

1 个答案:

答案 0 :(得分:0)

guava-23.6-jre

如果您使用以下 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

guava_jar


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