WebDriver等待find_elements_by_xpath

问题描述 投票:0回答:3

我正在尝试弄清楚 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))
python selenium webdriver
3个回答
4
投票

一旦至少有一个元素与 XPath 表达式匹配,您提出的预期条件实际上将计算为

True
。换句话说,它相当于:

expression = "//table[@id='%s']/tbody/tr" % myid
wait.until(EC.presence_of_element_located((By.XPATH, expression)))

1
投票

webdriver
不会等待页面加载——它不能,因为页面的内容可能会不断变化。相反,它只是执行
find_elements_*
命令,如果成功,
WebDriverWait(...).until
调用将返回找到的元素。它与
find_element_by_xpath
没有什么不同,只是可能会返回多个元素。


0
投票

较新版本的 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
© www.soinside.com 2019 - 2024. All rights reserved.