Python Selenium:等待一个元素或另一个元素加载
Python Selenium: waiting for one element OR another element to load
我正在使用此代码等待元素加载:
browser = webdriver.Chrome(executable_path=chromedriver,options=ChromeOpts, desired_capabilities=captain)
wait = WebDriverWait(browser, 5)
openbrowser = browser.get(url)
wait.until(EC.presence_of_element_located((By.ID, 'h1')))
browser.execute_script("window.stop();")
然而,我真正需要的是等待一个或另一个元素。
例如,我可以等待 'h1' 或 'rf-footer'.
谢谢,
您可以使用 expected_conditions
from selenium.webdriver.support import expected_conditions
完整的解决方案可以在这里找到:Selenium Expected Conditions - possible to use 'or'?
我是用 TRY/EXCEPT 买的。
openbrowser = browser.get(url) #navigate to the page
try:
wait.until(EC.presence_of_element_located((By.ID, id_stop)))
except:
wait.until(EC.presence_of_element_located((By.ID, 'rf-footer')))
browser.execute_script("window.stop();")
您可以在单个 wait()
操作中合并这两个检查 - 通过使用 python 的 lambda 表达式,使用 find_elements_*()
方法与 [=13= 粘合在一起]:
element = wait.until(lambda x: x.find_elements_by_id("id1") or x.find_elements_by_css_selector("#id2"))[0]
您甚至可以使用此方法获取最先匹配的元素 - 最后的 [0]
。
此解决方案有效,因为 find_elements_*()
returns 所有匹配元素的列表,如果没有这样的元素(布尔值 false)则为空。因此,如果第一个调用没有找到任何内容,则对第二个调用进行评估;重复直到他们中的任何一个找到匹配项,或者时间用完。
这种方法带来的好处是 wait.until()
将在两次通过之一后立即停止 - 例如速度。
与 try-catch 块相比 - 在其中,第一个条件必须失败(最多等待 X 秒,通常为 10 秒),甚至要检查第二个条件;因此,如果第一个为假,而第二个为真 - runtime/wait 将至少为 X 秒加上第二次检查所花费的时间。
在最坏的情况下,当两者都为假时,您将等待 2 倍,而 X 将两者结合起来。如果您添加其他条件,则只会增加该系数。
我正在使用此代码等待元素加载:
browser = webdriver.Chrome(executable_path=chromedriver,options=ChromeOpts, desired_capabilities=captain)
wait = WebDriverWait(browser, 5)
openbrowser = browser.get(url)
wait.until(EC.presence_of_element_located((By.ID, 'h1')))
browser.execute_script("window.stop();")
然而,我真正需要的是等待一个或另一个元素。 例如,我可以等待 'h1' 或 'rf-footer'.
谢谢,
您可以使用 expected_conditions
from selenium.webdriver.support import expected_conditions
完整的解决方案可以在这里找到:Selenium Expected Conditions - possible to use 'or'?
我是用 TRY/EXCEPT 买的。
openbrowser = browser.get(url) #navigate to the page
try:
wait.until(EC.presence_of_element_located((By.ID, id_stop)))
except:
wait.until(EC.presence_of_element_located((By.ID, 'rf-footer')))
browser.execute_script("window.stop();")
您可以在单个 wait()
操作中合并这两个检查 - 通过使用 python 的 lambda 表达式,使用 find_elements_*()
方法与 [=13= 粘合在一起]:
element = wait.until(lambda x: x.find_elements_by_id("id1") or x.find_elements_by_css_selector("#id2"))[0]
您甚至可以使用此方法获取最先匹配的元素 - 最后的 [0]
。
此解决方案有效,因为 find_elements_*()
returns 所有匹配元素的列表,如果没有这样的元素(布尔值 false)则为空。因此,如果第一个调用没有找到任何内容,则对第二个调用进行评估;重复直到他们中的任何一个找到匹配项,或者时间用完。
这种方法带来的好处是 wait.until()
将在两次通过之一后立即停止 - 例如速度。
与 try-catch 块相比 - 在其中,第一个条件必须失败(最多等待 X 秒,通常为 10 秒),甚至要检查第二个条件;因此,如果第一个为假,而第二个为真 - runtime/wait 将至少为 X 秒加上第二次检查所花费的时间。
在最坏的情况下,当两者都为假时,您将等待 2 倍,而 X 将两者结合起来。如果您添加其他条件,则只会增加该系数。