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

时间:2019-01-05 02:25:19

标签: 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')))
browser.execute_script("window.stop();")

但是,我真正需要的是等待一个元素或另一个。 因此,例如,我可以等待“ h1”或“ rf-footer”。

谢谢

3 个答案:

答案 0 :(得分:2)

您可以将两个检查合并在一个wait()操作中-使用python的lambda表达式,将两个检查与or粘合在一起:

# the imports for expected_conditions and By modules
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

wait.until(lambda x: EC.presence_of_element_located((By.ID, "id1")) or EC.presence_of_element_located((By.ID, "id2")))

您甚至可以使用这种方法来获取首先匹配的元素-或者,如果您不想使用ExpectedConditions

element = wait.until(lambda x: x.find_elements_by_id("id1") or x.find_elements_by_css_selector("#id2"))[0]

这种方法的好处是等待将在两次通过之一后立即停止-例如速度。
相对于try-catch块-在其中,第一个条件必须失败(等待长达X秒,通常为10秒),第二个条件甚至需要检查;因此,如果第一个为false,第二个为true,则运行时/等待时间至少应为X秒加上第二次检查所花费的时间。
在最坏的情况下,当两者都为假时,您将等待2倍的等待时间,而X则是将两者结合在一起。如果添加其他条件,则只会增加因子。

答案 1 :(得分:0)

您可以使用[Test] public void ReadFromCsvFileWithConfigurationMapTest() => ReadFromCsvFile<CalendarGeneralCsv, CalendarGeneralCsvMap>(121); [Test] public void ReadFromCsvFileWithOtherMapTest() => ReadFromCsvFile<CalendarGeneralCsv, OtherGeneralCsvMap>(151); private void ReadFromCsvFile<T, TMap>(int expectedValue) { //Arrange //Act var records = csvService.ReadFileCsv<T, TMap>(_csvToRead, ",") as IEnumerable<object>; var result = new List<object>(records); //Assert result.Should().NotBeNullOrEmpty(); result.Should().HaveCount(expectedValue); }

expected_conditions

完整的解决方案可以在这里找到:Selenium Expected Conditions - possible to use 'or'?

答案 2 :(得分:-1)

我用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();")