显式等待对Firefox不起作用(52.4.0(64位))

时间:2017-10-31 09:17:59

标签: selenium-webdriver

显式等待不适用于Firefox(52.4.0(64位))以下是我的代码:

public static void main(String[] args) {
    System.setProperty("webdriver.gecko.driver", "C:\\Drivers\\geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    driver.get("https://XXXX/XXXXX/XX/login");
    driver.findElement(By.id("userId")).sendKeys("XXXXX");
    driver.findElement(By.id("password")).sendKeys("XXXXX");
    driver.findElement(By.id("submit")).click();
    WebDriverWait wait = new WebDriverWait(driver, 50);
    wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//span[text()='Viewer']")));
    driver.findElement(By.xpath("//span[text()='Viewer']")).click();
}

我必须在任何情况下使用Explicit wait,因为元素不会在固定时间内加载。我在谷歌搜索了很多,但没有找到适合我的代码。

3 个答案:

答案 0 :(得分:2)

根据您的代码尝试,您似乎在等待 WebElement Explicit Wait ,然后尝试调用 {{ 1}} 方法。在您的代码中,您使用了 click() 条款与 presenceOfElementLocated ,根据documentation并未确认是否 ExpectedConditions 也是 WebElement Displayed

更好的解决方案是修改 Enabled 的条款而不是 ExpectedConditions 我们必须使用 {{1 如下:

presenceOfElementLocated

答案 1 :(得分:1)

您正在使用presenceOfElementLocated。根据文件:

  

期望检查元素是否存在于DOM的DOM上   页。这并不一定意味着该元素是可见的。

你必须确保你在元素上等待正确的预期条件。

答案 2 :(得分:1)

根据@DebanjanB,我只是使用presenceOfElementLocated不是一个好主意,而是使用elementToBeClickable总是更好,所以正确的代码应该是:

public static void main(String[] args) {
    System.setProperty("webdriver.gecko.driver", "C:\\Drivers\\geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    driver.get("https://XXXX/XXXXX/XX/login");
    driver.findElement(By.id("userId")).sendKeys("XXXXX");
    driver.findElement(By.id("password")).sendKeys("XXXXX");
    driver.findElement(By.id("submit")).click();
    WebDriverWait wait = new WebDriverWait(driver, 50);
    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[text()='Viewer']")));
    driver.findElement(By.xpath("//span[text()='Viewer']")).click();
}