Selenium webdriver 显式等待不适用于Firefox(52.4.0(64位))

Selenium webdriver 显式等待不适用于Firefox(52.4.0(64位)),selenium-webdriver,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");

显式等待不适用于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();
}
在任何情况下,我都必须在这里使用显式等待,因为元素不会在固定时间内加载。我在谷歌上搜索了很多,但没有找到适合我的代码

您正在使用。根据文件:

用于检查元素是否存在于 页这并不一定意味着元素是可见的


您必须确保您正在等待的元素符合正确的预期条件。

根据您的代码尝试,您似乎正在通过显式等待等待WebElement,然后尝试调用click方法。在代码中,您使用了带有ExpectedConditions的PresenceOfElementLocation子句,根据,该子句不会确认是否也显示并启用了WebElement

更好的解决方案是针对预期条件修改条款,其中我们必须使用以下元素,而不是元素的存在:

WebDriverWait wait = new WebDriverWait(driver, 50);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[text()='Viewer']")));

根据@DebanjanB的说法,我只是认为使用ElementLocated的Presence不是一个好主意,相反,最好使用ElementToEclickable,所以正确的代码应该是:

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