【问题标题】:Python Selenium Explict wait doen not raise TimeoutExceptionPython Selenium 显式等待不会引发 TimeoutException
【发布时间】:2017-12-04 10:45:04
【问题描述】:
browser = webdriver.PhantomJS()
def get_score(url):
    browser.get(url)
    elements = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//span[@class='shopdsr-score-con']")))
    description_score = float(elements[0].text)
    service_score = float(elements[1].text)
    logistics_score = float(elements[2].text)

关于是我的代码。有时这可能会卡住很长时间,我希望如果卡住 30 秒应该有TimeOutException,因为我有这个代码wait = WebDriverWait(browser, 30) 但这永远不会发生,程序只是在那里等待......有什么问题?

【问题讨论】:

    标签: python selenium phantomjs


    【解决方案1】:

    使用try,except

       from selenium.common.exceptions import TimeoutException
       from selenium.webdriver.support.ui import WebDriverWait
       from selenium.webdriver.support import expected_conditions as EC
    
       timeout=30
    
       try:
           element_present1 = EC.presence_of_element_located((By.XPATH, "//input[@name='username']"))
           WebDriverWait(driver, timeout).until(element_present1)
       except TimeoutException:
           print "Timed out waiting for login page to load"
    

    【讨论】:

      【解决方案2】:

      正如你所提到的,你已经有效地设置了WebDriverWait(browser, 30),你的代码看起来像这样:

      browser = webdriver.PhantomJS()
      def get_score(url):
          browser.get(url)
          elements = WebDriverWait(browser, 30).until(EC.presence_of_all_elements_located((By.XPATH, "//span[@class='shopdsr-score-con']")))
          description_score = float(elements[0].text)
          service_score = float(elements[1].text)
          logistics_score = float(elements[2].text)   
      

      从逻辑上讲,您的代码块中没有错误,但 the program just wait there 没有错误,因为当您调用 get(url) 时,Web 客户端即 PhantomJS Browser 不会返回这么早回来document.readyState = "complete"JavaScriptAJAX Calls 仍在继续加载。因此 Page Loading 被拉长了。

      一旦 Web 客户端返回 document.readyState = "complete",即 PhantomJS Browser,那么只有 Selenium 会执行下一行代码:

      elements = WebDriverWait(browser, 30).until(EC.presence_of_all_elements_located((By.XPATH, "//span[@class='shopdsr-score-con']")))
      

      因此程序只需在那里等待一段时间。

      更新:

      根据您的评论,您需要查看 pageLoadStrategy 的选项,将 pageLoadStrategy 设置为 eagernone 根据这个 QA Don't wait for a page to load using Selenium in Python

      【讨论】:

      • 更新了我的答案。请单击 VoteDown 箭头下方我的答案旁边的刻度线,将答案标记为已接受,这样刻度线就会变为绿色。
      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多