Selenium WebElement.Click() 是否等到下一页加载完毕?
Does Selenium WebElement.Click() wait until the next page is loaded?
我告诉 Selenium 等到它看到一个元素 - Selenium 看到它
我告诉 Selenium 单击此元素,它是一个 link 到新页面的按钮 - Selenium 单击它。
问题是点击之后,Selenium 会等到下一页完全加载(页面有时会在一秒钟内加载,或者等待很长时间,我认为这是 Zen Desk Live Chat 的问题页)。
加载满后会报错说点击的元素看不到(自然看不到,因为现在在新页面)
我试过用
改变等待时间
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
然而这并没有帮助。
我也试过
wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath(element)));
然而这有同样的问题。
下面是我目前使用的代码。
try {
wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath(element)));
WebElement we = driver.findElement(By.xpath(element));
we.click();
System.out.println("Clicked: " + element);
}catch (Exception e){
System.out.println(e.getMessage());
}
我希望一旦元素被点击,Selenium 就会继续运行而不关心下一页是否已经加载。
然而,当第二页加载时,有时页面会卡住 "waiting for widget-mediator.zopim.com" 并且 Selenium 不会继续通过 click() 行,直到 WebDriverWait 时间到期(60 秒)
60 秒过后,我在控制台输出中看到此错误:
[1561374309.111][SEVERE]: Timed out receiving message from renderer: 60.000
[1561374309.112][SEVERE]: Timed out receiving message from renderer: -0.002
这里还有其他事情发生吗?还是 Click() 等到页面加载完毕(如果该点击将其带到新页面)?如果有,有没有办法告诉它停止等待?我有其他代码来检查页面是否已加载,但我不需要 Click() 来执行此操作。
提前致谢。
Selenium(或更准确地说,WebDriver)的点击行为受 W3C WebDriver Specification 控制。在该文档中,完整的算法定义了请求元素单击时发生的情况。一般来说,如果点击将导航到一个新页面,驱动程序将根据 页面加载策略 等待该新页面被“加载”(故意恐吓引用),直到 页面加载超时.
页面加载策略默认为“正常”,或者等待文档的readyState
完成。如果您在驱动程序实例化期间请求的功能中将其设置为“none”,则驱动程序根本不会等待。选择该路由意味着您需要处理正在加载的页面的所有同步。请注意,还有第三种页面加载策略,“eager”,但在撰写本文时,并非所有 WebDriver 实现(最著名的是 chromedriver)都支持它。
您可以在运行时在 Selenium 代码中调整页面加载超时。一种方法可能是在单击此特定元素期间将超时值降低到相对较低的值,然后将其恢复到之前的值。这里的缺点是你必须捕获页面加载超时时抛出的超时异常才能继续。
我告诉 Selenium 等到它看到一个元素 - Selenium 看到它 我告诉 Selenium 单击此元素,它是一个 link 到新页面的按钮 - Selenium 单击它。
问题是点击之后,Selenium 会等到下一页完全加载(页面有时会在一秒钟内加载,或者等待很长时间,我认为这是 Zen Desk Live Chat 的问题页)。
加载满后会报错说点击的元素看不到(自然看不到,因为现在在新页面)
我试过用
改变等待时间driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
然而这并没有帮助。 我也试过
wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath(element)));
然而这有同样的问题。
下面是我目前使用的代码。
try {
wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath(element)));
WebElement we = driver.findElement(By.xpath(element));
we.click();
System.out.println("Clicked: " + element);
}catch (Exception e){
System.out.println(e.getMessage());
}
我希望一旦元素被点击,Selenium 就会继续运行而不关心下一页是否已经加载。
然而,当第二页加载时,有时页面会卡住 "waiting for widget-mediator.zopim.com" 并且 Selenium 不会继续通过 click() 行,直到 WebDriverWait 时间到期(60 秒) 60 秒过后,我在控制台输出中看到此错误:
[1561374309.111][SEVERE]: Timed out receiving message from renderer: 60.000
[1561374309.112][SEVERE]: Timed out receiving message from renderer: -0.002
这里还有其他事情发生吗?还是 Click() 等到页面加载完毕(如果该点击将其带到新页面)?如果有,有没有办法告诉它停止等待?我有其他代码来检查页面是否已加载,但我不需要 Click() 来执行此操作。
提前致谢。
Selenium(或更准确地说,WebDriver)的点击行为受 W3C WebDriver Specification 控制。在该文档中,完整的算法定义了请求元素单击时发生的情况。一般来说,如果点击将导航到一个新页面,驱动程序将根据 页面加载策略 等待该新页面被“加载”(故意恐吓引用),直到 页面加载超时.
页面加载策略默认为“正常”,或者等待文档的readyState
完成。如果您在驱动程序实例化期间请求的功能中将其设置为“none”,则驱动程序根本不会等待。选择该路由意味着您需要处理正在加载的页面的所有同步。请注意,还有第三种页面加载策略,“eager”,但在撰写本文时,并非所有 WebDriver 实现(最著名的是 chromedriver)都支持它。
您可以在运行时在 Selenium 代码中调整页面加载超时。一种方法可能是在单击此特定元素期间将超时值降低到相对较低的值,然后将其恢复到之前的值。这里的缺点是你必须捕获页面加载超时时抛出的超时异常才能继续。