首页 > 解决方案 > 如何迭代硒中的元素

问题描述

实际上,我想在“outlook:live”的垃圾文件夹中逐一阅读电子邮件并将电子邮件标记为“非垃圾邮件”。使用 xpath 选择的电子邮件

emails = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH,"//div[@class = 'xoCOIP8PzdTVy0T6q_uG6']")))

此 xpath 匹配 400 个实例。我想创建一个循环来一次选择一封电子邮件,例如选择第一封电子邮件,单击 div 并执行操作,然后是第二封电子邮件,依此类推。我正在尝试这个

 emails = WebDriverWait(driver, 
 5).until(EC.element_to_be_clickable((By.XPATH,"//div[@class = 
 'xoCOIP8PzdTVy0T6q_uG6']")))

 for count in range(0,len(emails)):
    (emails)[count+1].click()

请帮助我知道我在哪里做错了。提前致谢

标签: selenium-webdriver

解决方案


您用来返回可点击元素的函数似乎只返回一个元素,因此您必须使用不同的函数、更改逻辑等。

例如,您可以使用 Selenium find_elements_by_xpath("//div[@class = 'xoCOIP8PzdTVy0T6q_uG6']"),如果找到元素,它将返回 WebElement 对象列表,如果未找到元素,则返回空列表。当然,这不会考虑元素没有完全加载到页面上的可能性。以我的经验,打开页面后只需拍一下time.sleep(10)就“足够好”了。

我建议确保您的元素可以被首先发现并与之交互,以确保这不是徒劳的,如果您还没有这样做的话。


另一种选择是 elements_to_be_clickable()在预期条件源代码中添加另一个函数,比如函数。

从预期条件文档中,我做了一些研究,看起来该element_to_be_clickable()函数只返回一个元素。而且,从源代码来看,该函数主要是利用了该visibility_of_element_located()函数。我相信您可以遵循与该element_to_be_clickable()函数类似的逻辑,而是使用该visibility_of_all_elements_located()函数来返回多个 WebElement(因为visibiilty_of_all_elements_located()返回 WebElement 列表)。


推荐阅读