【问题标题】:Selenium WebDriverWait is taking too longSelenium WebDriverWait 花费的时间太长
【发布时间】:2020-11-03 18:53:08
【问题描述】:

我正在使用的 html element 有两种可能的 xpath 配置。

我想检查第一个配置是否存在不超过 1 秒。然后我想检查是否存在第二个配置。我就是这样做的:

import time
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException

browser.get(URL)
browser.implicitly_wait(6)

element = browser.find_elements_by_xpath("/html/body/div[4]/div[3]/div[1]/ ......")


try:
    time1 = time.time()
# The following 2 lines are taking too long:
    wait = WebDriverWait(element, 1)
    finalElement1 = wait.until(EC.presence_of_element_located((By.XPATH, ".//div[@class='classNAME']/a/header/div[@class='OtherClassName']/span[@class='FinalClassName']"))).text
    print("First element took (seconds) to find :" + str((time.time()-time1)))
# This prints around 0.02 seconds
    except (TimeoutException, Exception):
         print("Took this amount of seconds to timeout: "+ str((time.time()-time1)))
# This prints around 6 seconds 
         try:
              time1 = time.time()
              tempElement = element.find_element_by_xpath(".//div[@class='_0xLoFW _78xIQ- EJ4MLB JT3_zV']/a/header/div[@class='_0xLoFW u9KIT8 _7ckuOK']")
               finalElement1 = tempElement.find_element_by_xpath(".//span[@class='u-6V88 ka2E9k uMhVZi dgII7d z-oVg8 _88STHx cMfkVL']").text
               finalElement2 = tempElement.find_element_by_xpath(".//span[@class='u-6V88 ka2E9k uMhVZi FxZV-M z-oVg8 weHhRC ZiDB59']").text
               print("Second element took (seconds) to find : "+ str((time.time()-time1)))
# This prints around 0.08 seconds
               except:
                    print("None of the above")
                    continue
               pass

主要问题是当我将其显式设置为wait = WebDriverWait(element, 1) 时,查找finalElement1(在第一个try 块中)的函数需要大约6 秒才能超时。我很困惑

我知道on SOon the selenium blog 已经有很多关于此的内容,但由于某种原因,我无法让它发挥作用。有谁知道它为什么会这样?

【问题讨论】:

  • 这是因为: browser.implicitly_wait(6) 这是一个全局设置。此外,您不应混合使用隐式等待和显式等待。
  • 隐式等待对于在此处加载页面的其余部分很重要。您能否解释一下为什么将两者混合使用不是一个好习惯?
  • 把它拿出来并没有解决我的问题
  • 没关系,这正是问题所在。但是,我必须将其设置为新值才能生效。谢谢!

标签: python selenium


【解决方案1】:

可以在官方文档中找到答案,打开this url查看如下内容:

警告:不要混合隐式和显式等待。这样做可能会导致无法预测的等待时间。例如,设置 10 秒的隐式等待和 15 秒的显式等待可能会导致 20 秒后发生超时。

如果你真的需要同时使用隐式和显式等待,你可以这样尝试:

browser.implicitly_wait(0)   <-- set implicit wait to the default value 0 before explicit waits

finalElement1 = wait.until(EC.presence_of_element_located((By.XPATH, ".//div[@class='classNAME']/a/header/div[@class='OtherClassName']/span[@class='FinalClassName']"))).text

browser.implicitly_wait(6)   <-- set implicit wait to the value you need after explicit waits

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多