Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Selenium:等待加载一个元素或另一个元素_Python_Python 3.x_Selenium_Webdriverwait - Fatal编程技术网

Python Selenium:等待加载一个元素或另一个元素

Python Selenium:等待加载一个元素或另一个元素,python,python-3.x,selenium,webdriverwait,Python,Python 3.x,Selenium,Webdriverwait,我使用以下代码等待加载元素: 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'))) brows

我使用以下代码等待加载元素:

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'


谢谢,

您可以通过使用
预期条件来实现这一点

from selenium.webdriver.support import expected_conditions

完整的解决方案可以在这里找到:

我使用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\u elements.*()
方法:

element = wait.until(lambda x: x.find_elements_by_id("id1") or x.find_elements_by_css_selector("#id2"))[0]
您甚至可以使用这种方法来获取首先匹配的元素—最后的
[0]

此解决方案有效,因为
find_elements_*()
返回所有匹配元素的列表,如果没有匹配元素,则返回一个空列表(布尔值false)。因此,如果第一个调用没有找到任何东西,则对第二个调用进行评估;这会重复,直到他们中的任何一个找到匹配项,或者时间用完

这种方法的好处是,
wait.until()
将在两次传递中的一次之后立即停止,例如速度


与try-catch块相比,在它中,第一个条件必须失败(等待长达X秒,通常为10秒),第二个条件甚至要被检查;因此,如果第一个为false,而第二个为true,则运行时/等待时间至少为X秒加上第二次检查所需的时间。

在最坏的情况下,当两者都为false时,等待时间为2X,而将两者合并时等待时间为X。如果添加其他条件,则只会增加系数。

谢谢!我是用TRY/EXCEPT买的
openbrowser=browser.get(url)#导航到页面尝试:wait.until(EC.presence_of_element_located((By.ID,ID_stop)))除了:wait.until(EC.presence_of_element_located((By.ID,'rf footer'))浏览器。执行_脚本(“window.stop()”)
谢谢!!我尝试了第一个,得到了:
AttributeError:“WebDriver”对象没有属性“presence\u of\u element\u located”
有什么办法解决它吗?我在手机上笨手笨脚的,笨手笨脚的(同样,现在祈祷:)。问题是
presence\u of_element\u located()
expected\u条件中的一个类,而不是webdriver对象的一个方法(lambda中的
x
)。现在它发生了另一个异常。执行后:
browser.execute_script(“return document.documentElement.outerHTML”)
我得到:
selenium.common.exceptions.WebDriverException:Message:unknown error:unknown read属性'outerHTML'为null
当我试图获取HTML时,它似乎返回null。我想我得到了,我放置了
time.sleep(x)
在运行最后一个脚本之前。