我正在努力学习硒,我正在等待的元素之一,我将解释它。
我正在使用谷歌翻译自动翻译java程序。 但是由于谷歌翻译的异步性质,没有办法在没有等待它的情况下获取元素,代码崩溃,因为它没有找到元素,并且元素在代码需要时不存在它,你必须等待一段时间,直到服务器响应你的请求。
我认为处理硒和网页不是一个奇怪的情况所以我认为必须有一个简单的方法来做到这一点。 到目前为止,这是我为管理情况而创建的代码。
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());
}
你能说我怎么容易吗?
答案 0 :(得分:2)
您正在使用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 :(得分: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();
}
希望它有所帮助.. :)