当前位置: 首页 > 知识库问答 >
问题:

Selenium如何管理页面加载等待?

孙乐逸
2023-03-14

我开发网络爬虫有一段时间了,对我来说最常见的问题是等待页面完全加载,包括请求,框架,脚本。我是说彻底结束了。

我使用了几种方法来修复它,但当我使用多个线程来抓取网站时,我总是遇到这种问题。驱动程序打开自己,通过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--如何等待页面完全加载

共有3个答案

曾实
2023-03-14
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`
司马彦
2023-03-14

在代码中,您将检查 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')"));

翟棋
2023-03-14

等待<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);
    }
}

将是一个纯粹的开销。

您可以在中找到一些相关讨论:

  • Selenium IE WebDriver仅在调试时有效
  • 我们是否有任何通用函数来检查页面是否已完全加载到Selenium

有效的方法是将网络驱动程序Wait与预期条件结合起来:

    < li >元素的存在 < li >元素的可见性 < li >元素的交互性

您可以在中找到一些相关讨论:

  • Selenium:selenium如何识别可见或不可见的元素?它是否可能在DOM中加载但未在UI上呈现?
  • WebDriver等待未按预期工作

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”,因为页面在运行该语句之前没有加载。 这是预期行为吗?我应该是狩猎旅行的特例吗?