等待时,使用Selenium中Xpath获取第n次出现的元素

2024-04-20 11:05:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Selenium抓取一个大型静态网页。我提前知道页面上将出现多少<a>元素。因为这是一个非常大的页面,我想确保它是完全加载之前,试图刮它。我的解决方案是等到最后一个<a>元素被加载。{如图所示,}使用

driver.get(url)
try:
    WebDriverWait(driver, 500).until(EC.presence_of_element_located(driver.find_elements_by_xpath('//*[@title="View recipe"]')[count]))
except TimeoutException:

但它抛出了一个错误:

^{pr2}$

我做错什么了?在


Tags: url元素网页getdriverselenium静态页面
2条回答

为什么不等待页面加载?下面是C代码,应该与Python中的类似。JavaScript部分应该完全相同。在

protected void WaitForDocumentReadyStateComplete()
{
    try
    {
        new WebDriverWait(target.Driver, TimeSpan.FromSeconds(DefaultTimeoutInSeconds)).Until(
            d => ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState").Equals("complete"));
        // Safari (Mac) sometimes hangs for 30 seconds then throws WebDriverTimeoutException => can safely be ignored
    }
    catch (Exception)
    {
        if (!target.IsSafari)
        {
            // MSIE (Win) sometimes throws "UnexpectedJavaScriptError" => Workaround: wait maximum time
            Thread.Sleep(DefaultTimeoutInSeconds * 1000);
        }
    }
}

或者等待预期的URL(如果重新加载页面且URL不变,则可能无法工作):

^{pr2}$

presence_of_element_located()和其他预期的条件,在第一个也是唯一的参数中,预期一个元组的定位器类型为第一项,定位器值为第二项:

from selenium.webdriver.common.by import By
EC.presence_of_element_located((By.XPATH, '//*[@title="View recipe"]'))

相关问题 更多 >