gpt4 book ai didi

Python Selenium 等待加载多个元素

转载 作者:行者123 更新时间:2023-11-28 18:45:02 25 4
gpt4 key购买 nike

我有一个列表,它是由 AJAX 动态加载的。起初,在加载时,它的代码是这样的:

<ul><li class="last"><a class="loading" href="#"><ins>&nbsp;</ins>Загрузка...</a></li></ul>

加载列表时,所有 li 和 a 都会更改。而且总是超过1里。像这样:

<ul class="ltr">
<li id="t_b_68" class="closed" rel="simple">
<a id="t_a_68" href="javascript:void(0)">Category 1</a>
</li>
<li id="t_b_64" class="closed" rel="simple">
<a id="t_a_64" href="javascript:void(0)">Category 2</a>
</li>
...

我需要检查列表是否加载,所以我检查它是否有多个 li。

到目前为止我试过:

1)自定义等待条件

class more_than_one(object):
def __init__(self, selector):
self.selector = selector

def __call__(self, driver):
elements = driver.find_elements_by_css_selector(self.selector)
if len(elements) > 1:
return True
return False

...

try:
query = WebDriverWait(driver, 30).until(more_than_one('li'))
except:
print "Bad crap"
else:
# Then load ready list

2) 基于find_elements_by的自定义函数

def wait_for_several_elements(driver, selector, min_amount, limit=60):
"""
This function provides awaiting of <min_amount> of elements found by <selector> with
time limit = <limit>
"""
step = 1 # in seconds; sleep for 500ms
current_wait = 0
while current_wait < limit:
try:
print "Waiting... " + str(current_wait)
query = driver.find_elements_by_css_selector(selector)
if len(query) > min_amount:
print "Found!"
return True
else:
time.sleep(step)
current_wait += step
except:
time.sleep(step)
current_wait += step

return False

这不起作用,因为驱动程序(传递给此函数的当前元素)在 DOM 中丢失了。 UL 没有改变,但由于某种原因,Selenium 无法再找到它。

3) 显式等待。这很糟糕,因为有些列表会立即加载,而有些则需要 10 多秒才能加载。如果我使用这种技术,每次发生时我都必须等待最长时间,这对我来说非常糟糕。

4) 我也等不及正确地使用 XPATH 等待子元素。这个只是期待 ul 出现。

try:
print "Going to nested list..."
#time.sleep(WAIT_TIME)
query = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, './/ul')))
nested_list = child.find_element_by_css_selector('ul')

请告诉我正确的方法,以确保为指定元素加载了多个继承元素。

附言所有这些检查和搜索都应该与当前元素相关。

最佳答案

首先也是最重要的元素是 AJAX元素。

现在,根据定位所有所需元素并创建一个列表的要求,最简单的方法是引入WebDriverWait。对于 visibility_of_all_elements_located()您可以使用以下任一项 Locator Strategies :

  • 使用 CSS_SELECTOR:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "ul.ltr li[id^='t_b_'] > a[id^='t_a_'][href]")))
  • 使用 XPATH:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//ul[@class='ltr']//li[starts-with(@id, 't_b_')]/a[starts-with(@id, 't_a_') and starts-with(., 'Category')]")))
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC

如果您的用例是等待加载一定数量的元素,例如10 个元素,您可以使用 lambda 函数,如下所示:

  • 使用 >:

    myLength = 9
    WebDriverWait(driver, 20).until(lambda driver: len(driver.find_elements_by_xpath("//ul[@class='ltr']//li[starts-with(@id, 't_b_')]/a[starts-with(@id, 't_a_') and starts-with(., 'Category')]")) > int(myLength))
  • 使用==:

    myLength = 10
    WebDriverWait(driver, 20).until(lambda driver: len(driver.find_elements_by_xpath("//ul[@class='ltr']//li[starts-with(@id, 't_b_')]/a[starts-with(@id, 't_a_') and starts-with(., 'Category')]")) == int(myLength))

You can find a relevant discussion in How to wait for number of elements to be loaded using Selenium and Python


引用资料

您可以在以下位置找到一些相关的详细讨论:

关于Python Selenium 等待加载多个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21631116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com