Python Selenium等待页面加载

12

我已经编写了一个脚本,从一个页面获取数据,但是有时候页面需要加载一段时间,所以当它将HTML转换成soup对象时,有时会什么也提取不到,因为页面仍然需要完成加载。

我编写了以下代码来等待页面完成加载。

def scrape_page(url):
     browser.get(url)    
     try:
        WebDriverWait(browser, 10).until(EC.presence_of_element_located(browser.find_element_by_id ("selection-box")))
        #Extract Source Code 
        html = browser.page_source;
        soup = BeautifulSoup(html)

它有效。

但是当我调用该函数时,我遇到了以下错误;

TypeError: find_element() argument after * must be a sequence, not WebElement
3个回答

13

我认为你应该这样使用 presence_of_element_located:

element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )

手册 中所述。


我最初尝试了这个,但是出现了全局名称By未定义的错误。唯一不同的是我使用的是Chrome Driver而不是Firefox。 - Grant McKinnon
http://selenium-python.readthedocs.org/en/latest/api.html?highlight=#module-selenium.webdriver.common.by - sobolevn
4
在使用之前,请导入Byfrom selenium.webdriver.common.by import By - WKPlus
@GrantMcKinnon- 你需要导入以下代码:from selenium.webdriver.common.by import By - SIslam
1
这个回答中的链接已经失效了。链接已挂。 - Andrew

4

在这个问题6年后,我寻找的所有解决方案都不适用于我的情况,我在其他编程语言中找到了解决方案,并为Python实现了该解决方案,所以这是等待页面完全加载的最佳方法。

WebDriverWait(self.driver, self.SERVER_TIMEOUT).until(
        lambda wd: self.driver.execute_script("return document.readyState") == 'complete',
        "Page taking too long to load"
    )

1

我将此函数应用于我需要使用的每个WebElement。

from selenium import webdriver

def FindElem(Driver: webdriver, XPath: str, Timeout: int = 300):
    while Timeout > 0:
        try:
            return Driver.find_element_by_xpath(XPath)
        except: # if element isn't already loaded or doesn't exist
            time.sleep(1)
            Timeout -= 1
    raise RuntimeError(f"Page loading timeout") # or whatever the hell you want

使用方法:

Driver = webdriver.Firefox()
webdriver.get("http://somewhere.com/somepage.html")
MyWebElement = FindElem(Driver, "//input[@name='email']") # raise exception if timeout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接