我正在使用以下代码等待元素加载:
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”。
谢谢
答案 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();")