我开发网络爬虫有一段时间了,对我来说最常见的问题是等待页面完全加载,包括请求,框架,脚本。我是说彻底结束了。
我使用了几种方法来修复它,但当我使用多个线程来抓取网站时,我总是遇到这种问题。驱动程序打开自己,通过URL,不等待并通过下一个URL。
我的尝试是:
JavascriptExecutor js = (JavascriptExecutor) driver.getWebDriver();
String result = js.executeScript("return document.readyState").toString();
if (!result.equals("complete")) {
Thread.sleep(1000)
}
}
wait . until(expected conditions . visibilityofelementlocated(by . XPath));
当我运行单线程代码时,我对页面没有问题,但是,当我使用多线程时,它变成了一场噩梦。网络无法像单线程一样处理网页,这就是为什么我需要等待。我正在寻找一个确切的解决方案。有没有进度监听者或类似的东西?
我在等你的建议。
类似问题:
Selenium--如何等待页面完全加载
public static void processing(){
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
}`enter code here`
在代码中,您将检查 readyState
,如果值不完整,
则只需Hibernate
一秒钟,然后继续执行后续步骤。这是代码,使用Web驱动程序
等待10秒。或者你可以使用简单的 for 循环:
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(d -> ((JavascriptExecutor) d).executeScript("return document.readyState !== 'loading'"));
或使用交互式
wait.until(d -> ((JavascriptExecutor) d).executeScript("return (document.readyState === 'complete' || document.readyState === 'interactive')"));
等待<code>文档。readyState是完整的
并不是确保元素的存在性、可见性或可交互性的完全证明方法。
因此,该函数:
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);
}
}
将是一个纯粹的开销。
您可以在中找到一些相关讨论:
有效的方法是将网络驱动程序Wait与预期条件结合起来:
您可以在中找到一些相关讨论:
WebDriver不是线程安全的。话虽如此,如果您可以序列化对底层驱动程序实例的访问,您可以在多个线程中共享引用。这是不可取的。但是您总是可以为每个线程实例化一个WebDriver实例。
理想情况下,线程安全问题不在代码中,而是在实际的浏览器绑定中。它们都假设一次只有一个命令(例如,像真实用户一样)。但另一方面,您可以始终为每个线程实例化一个WebDriver实例,这将启动多个浏览选项卡/窗口。到目前为止,您的程序似乎是完美的。
现在,不同的线程可以在同一个Webdrive上运行,但是测试的结果不会是您期望的。背后的原因是,当您使用多线程在不同的选项卡/窗口上运行不同的测试时,需要一点线程安全编码,否则您将执行的操作,如Click()
或send_keys()
将转到当前具有焦点的打开的选项卡/窗口,而不管您期望运行的线程是什么。这本质上意味着所有测试将同时在具有焦点的同一选项卡/窗口上运行,但不在预期的选项卡/窗口上。
我正在使用selenium web驱动程序3.4.0查找网站的响应时间。在较早的版本中,我使用了WebDriver wait=new WebDriverWait(driver,10);Wait.Until(ExpectedConditions.VisibilityOfElementLocated(By.id(“myid”)));查找加载的页面。 但这两行代码不适用于版本3.4.0。有没有其他方法可
问题内容: 我编写了一个脚本,该脚本从页面中获取数据,但是有时页面需要花费一些时间来加载,因此当将html拉到汤对象中时,有时它什么也不会拉,因为页面仍然需要完成。 我编写了以下代码以等待页面完成。 有用 但是调用函数时出现以下错误; 问题答案: 我认为您应该这样使用: 如手册所述。
我尝试遵循return((JavascriptExecutor)driver.executescript(“return document.readystate”).equals(“complete”); 但它不起作用 基本上,上面的命令不能识别以下操作[testng]1535139249496 addons.productaddons信息发送请求到:https://aus5.mozilla.or
我想在点击后获取页面的页面源。然后使用browser.back()函数返回。但是Selenium不会让页面在点击后完全加载,并且由JavaScript生成的内容不包含在该页面的页面源中。
问题内容: 使用Selenium2Driver将Behat与Mink结合使用时,是否有办法可靠地等待页面加载? 我继承了一些旧的测试,像这样等待: 即仅此一次测试就需要1分钟30秒。 我想做的是有一种通用的方式来等待上一次单击以导致页面加载,而不必每次都等待大量固定的时间。 我可以看到等待页面加载的所有建议,都涉及检查是否已加载特定页面元素。 但是,这些测试是针对各种传统网站运行的,这些网站中并不
Selenium的SafariDriver似乎不会等待网页加载。我的测试如下: 如果您使用或运行此功能,它将正常运行,即搜索“您好世界”,然后在结果页面上转到图像结果。 使用,它会失败: 找不到的元素是“Images”,因为页面在运行该语句之前没有加载。 这是预期行为吗?我应该是狩猎旅行的特例吗?