我正在尝试弄清楚 WebDriverWait 如何与
find_elements_by_xpath
配合使用。它如何知道所有相关元素已加载,还是只是等待页面加载。
我可以使用
find_element_by_xpath
理解是否有特定元素,但使用 find_elements_by_xpath
则不确定。
例如:
elements = WebDriverWait(driver, 5).until(lambda driver: driver.find_elements_by_xpath("//table[@id='%s']/tbody/tr" % myid))
一旦至少有一个元素与 XPath 表达式匹配,您提出的预期条件实际上将计算为
True
。换句话说,它相当于:
expression = "//table[@id='%s']/tbody/tr" % myid
wait.until(EC.presence_of_element_located((By.XPATH, expression)))
webdriver
不会等待页面加载——它不能,因为页面的内容可能会不断变化。相反,它只是执行 find_elements_*
命令,如果成功,WebDriverWait(...).until
调用将返回找到的元素。它与 find_element_by_xpath
没有什么不同,只是可能会返回多个元素。
较新版本的 selenium 有 EC.visibility_of_all_elements_ located()
从慢速 ldap 获取用户数据的示例 html,因此通常需要大约 2-3 秒来加载:
<div class="user-details-info">
<!-- Id-number --->
<div class="user-details-line">
<b id="label-username">Fødselsnummer</b>
<span>15917499923</span>
</div>
<!-- Name --->
<div class="user-details-line">
<b>Navn</b>
<span>BEGEISTRET OMSETNING</span>
</div>
<!-- Birthdate --->
<div class="user-details-line">
<b>Fødselsdato</b>
<span>15.11.1974</span>
</div>
<!-- Phone number --->
<div class="user-details-line collapsable">
<b>Mobilnummer</b>
<span id="user-phone">+4799114758</span>
</div>
<!-- External UserID --->
<div class="user-details-line collapsable">
<b>Virksomhetens BrukerID</b>
<span>test13-user-admin-lookupuser</span>
</div>
<!-- Id-proofed time --->
<div class="user-details-line collapsable">
<b>Dato for ID-kontroll</b>
<span>21.02.2024</span>
</div>
<!-- Id-proof method --->
<div class="user-details-line collapsable">
<b>ID-kontroll metode</b>
<span>BankID</span>
</div>
<!-- Organisation --->
<div class="user-details-line collapsable">
<b>Organisasjon</b>
<span>test-ikomm-test12</span>
</div>
<!-- Address --->
<div class="user-details-line">
<b>Adresse</b>
<span>Austvika 2, 7746 HASVÅG</span>
</div>
</div>
#!/usr/bin/env python3
from selenium import webdriver
from selenium.webdriver.firefox.service import Service as FirefoxService
import selenium.webdriver.firefox.options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
options = selenium.webdriver.FirefoxOptions()
options.log.level = "trace"
s = FirefoxService(log_path='./geckodriver.log')
wd = webdriver.Firefox(options=options)
# lots of stuff omitted
els = WebDriverWait(wd, 10).until(EC.visibility_of_all_elements_located((By.XPATH,"//div[starts-with(@class,'user-details-line')]")))
for el in els:
print(f"user-details:{el.text}")
user-details:Fødselsnummer
15917499923
user-details:Navn
BEGEISTRET OMSETNING
user-details:Fødselsdato
15.11.1974
user-details:Mobilnummer
+4799114758
user-details:Virksomhetens BrukerID
test13-user-admin-lookupuser
user-details:Dato for ID-kontroll
21.02.2024
user-details:ID-kontroll metode
BankID
user-details:Organisasjon
test-ikomm-test12
user-details:Adresse
Austvika 2, 7746 HASVÅG