【问题标题】:How do I wait for page to load in selenium after click?点击后如何等待页面在硒中加载?
【发布时间】:2021-03-29 21:29:04
【问题描述】:

我正在运行一个网络抓取脚本,我找不到任何可靠的方法来允许在脚本中运行下一行代码之前单击链接时重新加载页面。以下是我目前正在做的事情,虽然它有效,但我知道它取决于加载时间并且它绝对不是有效的。有谁知道我可以使用的 doThisWhenPageLoads() 方法是硒。顺便说一句,我正在使用节点,以防万一。

setTimeout(async () => {
        await driver.findElement(By.xpath('//*[@id="navigation"]/div[1]/ul/li[1]/div/div[1]/a')).click()
    }, 1500)
    // setTimeout(async () => {
        await driver.manage().timeouts().implicitlyWait(10, 10).findElement(By.xpath('//*[@id="navigation"]/div[1]/ul/li[1]/div/div[1]/div/div[2]/div[1]/ul/li[2]/a')).click()
    // }, 2500)
    setTimeout(async () => {
        await driver.findElement(By.xpath('//*[@id="content"]/div/div/div[2]/div/header/div/div[3]/nav/ul/li[1]/div/div/ul/li[6]/a')).click()
    }, 4500)
    setTimeout(async () => {
        await driver.findElement(By.xpath('//*[@id="content"]/div/div/div[2]/div/header/div/div[3]/nav/ul/li[1]/div/div[2]/ul/li[6]/ul/li[3]/a')).click()
    }, 6500)
    setTimeout(async () => {
        await driver.findElement(By.xpath('//*[@id="content"]/div/div/div[2]/div/header/div/div[3]/nav/ul/li[1]/div/div[2]/ul/li[6]/ul/li[3]/ul/li[2]/a')).click()
    }, 8500)
    setTimeout(async () => {
        const target = await driver.findElements(By.xpath('//ul[contains(@class, "product-list")]/li'))

        let arr = await target.map(async (x, index) => {
            let title = await x.findElement(By.xpath(`//li[${index + 1}]/div/div/div/div/div/div`)).getText()
            let price = await x.findElement(By.xpath(`//li[${index + 1}]/div/div/div/div/div[2]/form/div/div/div`)).getText()
            let pricePer100ml = await x.findElement(By.xpath(`//li[${index + 1}]/div/div/div/div/div[2]/form/div/div/div[2]`)).getText()
            let ok = { title, price, pricePer100ml }
            console.log(ok)
            return ok
        })
        console.log(arr)
    }, 13500)

【问题讨论】:

标签: node.js selenium selenium-webdriver web-scraping


【解决方案1】:

如果页面在按钮点击时加载,Selenium 已经等待。但在某些情况下,您可能需要等待,而 Selenium 不需要等待。在这些情况下,您可以通过 JavaScript 执行此操作。

我没有在 JavaScript 中使用 Selenium,但这里有一个 C# 实现,您可以根据自己的要求在 JavaScript 中轻松实现。

private void pageLoad(ChromeDriver driver)
{
    IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
    WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 0, 20));
    wait.Until(wd => js.ExecuteScript("return document.readyState").ToString() == "complete");
}

当页面完全加载时,document.readyState 将返回“完成”。因此,IJavaScriptExecutor 是 Selenium 提供的一个类,它允许我们在浏览器控制台中执行 JavaScript 代码。您需要检查如何在 JavaScript 中使用 IJavaScriptExecutor。

此函数将等待 20 秒。但是,您也可以通过使用 while 循环一直等到页面完全加载并检查 readyState 是否完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2016-10-13
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多