【问题标题】:python selenium wait for page to loadpython selenium 等待页面加载
【发布时间】:2015-05-20 03:13:25
【问题描述】:

我编写了一个从页面获取数据的脚本,但有时页面需要时间来加载,所以当它把 html 拉到汤对象中时,有时它什么也没拉,因为页面仍然需要完成。

我写了以下代码等待页面完成。

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

【问题讨论】:

    标签: python selenium


    【解决方案1】:

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

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

    manual 中所述。

    【讨论】:

    • 我最初尝试过这个,但是得到错误全局名称 By is not defined。唯一不同的是我使用 Chrome 驱动程序而不是 firefox
    • @GrantMcKinnonG import By 使用前:from selenium.webdriver.common.by import By
    • @GrantMcKinnon- 你必须从 selenium.webdriver.common.by import By 导入
    • 此答案中的链接已失效。 RIP 链接。
    【解决方案2】:

    我将此函数应用于我需要使用的每个 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
    

    【讨论】:

      【解决方案3】:

      从这个问题开始 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"
          )
      

      【讨论】:

        猜你喜欢
        • 2017-03-27
        • 1970-01-01
        • 2018-11-26
        • 1970-01-01
        • 2018-03-20
        • 1970-01-01
        • 2017-11-10
        • 2011-08-17
        • 2018-06-14
        相关资源
        最近更新 更多