【问题标题】:Selenium with Python Random Timeout without error messageSelenium 与 Python 随机超时没有错误消息
【发布时间】:2020-03-21 06:33:34
【问题描述】:

我正在关注此处的示例(在 Python 选项卡下):https://www.selenium.dev/documentation/en/

代码在这里:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support.expected_conditions import presence_of_element_located

    #This example requires Selenium WebDriver 3.13 or newer
    with webdriver.Firefox() as driver:
        wait = WebDriverWait(driver, 10)
        driver.get("https://google.com/ncr")
        driver.find_element_by_name("q").send_keys("cheese" + Keys.RETURN)
        first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
        print(first_result.get_attribute("textContent"))

我已经运行了这段代码并让它工作,显示第一个结果“显示更多”。但是,有时当我运行此代码时,这不起作用,并且会给出随机超时错误而没有消息:

    Traceback (most recent call last):
    File "c:\Users\User\PyCharm_Projects\Project\sample_test.py", line 12, in <module>
        first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
    File "C:\Program Files\Python38\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
        raise TimeoutException(message, screen, stacktrace)
    selenium.common.exceptions.TimeoutException: Message:

我的问题是:如果不是每次都发生超时错误,是什么原因导致的?我尝试使用其他方法(XPATH、链接文本)定位元素。我查看了以下其他示例,但他们发布的任何内容似乎都无法解决此问题:

试过了,没用 - Selenium random timeout exceptions without any message

不适用的解决方案 - Instagram search bar with selenium - Selenium Timeoutexception Error - Random TimeoutException even after using ui.WebDriverWait() chrome selenium python

我使用的是 Python 3.8、Firefox 68.6.0,这里是来自 'pip freeze' 的相关包 - 美丽的汤4==4.8.2 - 请求==2.22.0 - 硒==3.141.0 - urllib3==1.25.8 - webencodings==0.5.1

谢谢!

【问题讨论】:

  • 您好,我在过去的一个项目中也遇到过同样的问题。我发现的唯一解决方法是实现 try/except 逻辑并在重试之前使用 time.sleep(x)。
  • 嗨!只是要明确一点:问题是否与服务器时间慢有关?如果是这样,会做类似wait = WebDriverWait(driver, 1000) 的事情来确保所有内容都已加载。我想我只是不确定根本原因是什么。
  • 就我而言,问题是网站刷新了我的网络元素,使其在短时间内不存在。因为 web 驱动程序已经为这个元素分配了一个 id,所以它找不到它。所以这个 try/exception 逻辑对我很有效
  • 这似乎对我很有效!在我获取的每个元素周围都有 try/except 很烦人,但它似乎有效! (也许问题还在于我没有在所有内容的末尾包含 finally: driver.quit() 块)。您可以对此进行总结,我可以将其作为公认的答案!谢谢!

标签: python selenium web-scraping


【解决方案1】:

我针对这种情况做了一些自定义操作,例如:

def findXpath(xpath,driver):
    actionDone = False
    count = 0
    while not actionDone:
        if count == 3:
            raise Exception("Cannot found element %s after retrying 3 times.\n"%xpath)
            break
        try:
            element = WebDriverWait(driver, waitTime).until(
                    EC.presence_of_element_located((By.XPATH, xpath)))
            actionDone = True
        except:
            count += 1
    sleep(random.randint(1,5)*0.1)
    return element 

【讨论】:

    【解决方案2】:

    请参考下面的解决方案,我已经在 chrome 和 firefox 浏览器上执行了几次,它工作正常。当命令没有在足够的时间内完成时抛出 TimeoutException。

    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.by import By
    from selenium import webdriver
    
    #utilise chrome driver to open specified webpage
    driver = webdriver.Chrome(executable_path=r"chromedriver.exe")
    driver.maximize_window()
    driver.get("https://google.com/ncr")
    WebDriverWait(driver, 20).until(
    EC.visibility_of_element_located((By.NAME,"q"))).send_keys("cheese" + Keys.RETURN)
    
    
    first_result=WebDriverWait(driver, 20).until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, "h3>div")))
    
    print(first_result.get_attribute("textContent"))
    

    输出

    显示更多

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 2022-11-19
      • 1970-01-01
      • 2016-08-07
      • 2013-06-14
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多