我正在开发网络爬虫一段时间,对我来说最常见的问题是等待页面完全加载,包括请求、框架、脚本。我的意思是完全完成。
我使用了多种方法来修复它,但是当我使用多个线程来抓取网站时,我总是遇到这种问题。驱动程序自行打开,浏览该 URL,不等待并浏览下一个 URL。
我的尝试是:
JavascriptExecutor js = (JavascriptExecutor) driver.getWebDriver();
String result = js.executeScript("return document.readyState").toString();
if (!result.equals("complete")) {
Thread.sleep(1000)
}
}
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath));
当我运行单线程代码时,页面没有问题,但是,当我使用多线程时,它变成了一场噩梦。网络无法像单线程一样处理网页,这就是为什么我需要在那段时间等待。我正在寻找精确的解决方案。有没有进度监听器或者类似的东西?
我正在等待你的建议。
类似问题:
Selenium——如何等待页面完全加载 https://stackoverflow.com/questions/36590274/selenium-how-to-wait-until-page-is-completely-loaded
等待document.readyState
to be complete
不是确保的完整证明方法presence, 能见度 or 互动性一个元素的。
因此,函数:
JavascriptExecutor js = (JavascriptExecutor) driver.getWebDriver();
String result = js.executeScript("return document.readyState").toString();
if (!result.equals("complete")) {
Thread.sleep(1000)
}
}
甚至等待jQuery.active == 0
:
public void WaitForAjax2Complete() throws InterruptedException
{
while (true)
{
if ((Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")){
break;
}
Thread.sleep(100);
}
}
将是纯粹的开销。
您可以在以下位置找到一些相关讨论:
- Selenium IE WebDriver 仅在调试时有效 https://stackoverflow.com/questions/47709234/selenium-ie-webdriver-only-works-while-debugging/47710701#47710701
- 我们是否有任何通用函数来检查页面是否已在 Selenium 中完全加载 https://stackoverflow.com/questions/50327132/do-we-have-any-generic-function-to-check-if-page-has-completely-loaded-in-seleni/50329056#50329056
Solution
有效的方法是诱导WebDriver等待 https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/WebDriverWait.html与预期条件 https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html要么用于:
您可以在以下位置找到一些相关讨论:
- Selenium:硒如何识别可见或不可见的元素?是否有可能它已加载到 DOM 中但未渲染到 UI 上? https://stackoverflow.com/questions/48989049/selenium-how-selenium-identifies-elements-visible-or-not-is-is-possible-that-i/48990165#48990165
- WebDriverWait 未按预期工作 https://stackoverflow.com/questions/49775502/webdriverwait-not-working-as-expected/49775808#49775808
多个线程需要抓取
WebDriver 不是线程安全的 https://github.com/SeleniumHQ/selenium/wiki/Frequently-Asked-Questions#q-is-webdriver-thread-safe。话虽如此,如果您可以序列化对底层驱动程序实例的访问,则可以在多个线程中共享引用。这是不可取的。但您始终可以为每个线程实例化一个 WebDriver 实例。
理想情况下的问题是线程安全不在您的代码中,而是在实际的浏览器绑定中。他们都假设一次只有一个命令(例如,像真正的用户一样)。但另一方面,你总是可以实例化一个网络驱动程序每个线程的实例将启动多个浏览选项卡/窗口。到目前为止,您的程序似乎很完美。
现在,不同threads可以在同一个上运行网络驱动程序,但是测试结果将不会是您所期望的。背后的原因是,当您使用多线程在不同的选项卡/窗口上运行不同的测试时,需要一点线程安全编码,否则您将执行的操作如下click()
or send_keys()
将转到当前打开的选项卡/窗口focus不管thread你期望跑步。这本质上意味着所有测试将同时在同一个选项卡/窗口上运行focus but not在预期的选项卡/窗口上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)