Selenium等待元素加载

3

我正在尝试学习selenium,其中一个问题是等待元素加载,我来解释一下。

我正在使用Java程序自动翻译谷歌翻译。 但由于谷歌翻译的异步性质,没有办法在不等待的情况下获取元素,代码会崩溃,因为它找不到元素,并且元素在代码需要它的时候不存在,您必须稍等一下,直到服务器响应您的请求。

我认为这不是处理selenium和网页时陌生的情况,所以我认为一定有一种简单的方法来解决它。 目前,这是我创建的用于管理此情况的代码。

public void translation(String s) {

    System.setProperty("webdriver.chrome.driver", "C:\\Robots\\chromedriver.exe");

    WebElement webDriver = new ChromeDriver();

这是我认为应该有更好的方法来完成的代码, 我使用了一种等待翻译准备就绪的方法。
    waitForElement("//*[@id='result_box']");


    System.out.println("prhase: " + s + " tranlsation: " + response.getText());

    webDriver.close();
}

private void waitForElement(String element) {
    WebElement response;
    do {
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        response = webDriver.findElement(By.xpath(element));

    } while (response.getText().isEmpty());
}

你能告诉我如何轻松地做到吗?


1
有多种等待方法可用于等待元素,请参考此链接:http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp,它会对你有所帮助。 - sandeep kumar
2个回答

4

您正在使用Thread.sleep,实际上它并没有等待元素,只是无论如何都会等待3秒钟。

您可以尝试使用以下方法代替。

private void waitForElement(String element) {
 WebDriverWait wait = new WebDriverWait(Driver, 10); // Wait for 10 seconds.
 wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(element)));
 WebElement element = driver.findElement(By.xpath(element));

}

如果你不期望出现什么奇怪的情况,那么也不需要使用try / catch语句块。上面的代码将等待10秒钟以使元素出现。不确定是否需要使用最后一行代码。

希望对你有所帮助!


1
没问题,祝你好运! - Moser

1

不要使用Thread.sleep()while,而应该尝试使用WebDriverWait等待,直到使用ExpectedConditions.visibilityOfElementLocated如下所示:

private WebElement waitForElement(String element) {
    WebDriverWait wait = new WebDriverWait(webDriver, 10); //It will wait upto 10 seconds

    return wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(element))); 
}

现在你可以将你的translation方法修改如下:
public void translation(String s) {

    System.setProperty("webdriver.chrome.driver", "C:\\Robots\\chromedriver.exe");

    WebElement webDriver = new ChromeDriver();
    WebElement response = waitForElement("//*[@id='result_box']");

    System.out.println("prhase: " + s + " tranlsation: " + response.getText());

    webDriver.close();
}

希望能有所帮助..: )

可以了,谢谢。我选择了"Moser"的答案作为最佳答案,因为你有更多的积分,只是想让他成长一下 :) - David Marciel
@DavidMarciel 好的,没问题... :) - Saurabh Gaur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接