selenium-webdriver - 如何迭代硒中的元素
问题描述
实际上,我想在“outlook:live”的垃圾文件夹中逐一阅读电子邮件并将电子邮件标记为“非垃圾邮件”。
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 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 列表)。
推荐阅读
- ios - 如何动画 UISwitch 切换
- javascript - 使用状态解析渲染中的 componentDidMount 值
- windows-subsystem-for-linux - 是否可以在需要时在 WSL 版本之间切换?
- python - 如何在python中读取json中的json?
- android - 无法从 android Webview 打开拨号盘,因为它显示 tel: net::ERR_UNKNOWN_URL_SCHEME
- c# - 在 Xamarin Android 中将 DPI 设置为 PNG 图像位图
- javascript - 销毁道具时无法读取未定义的属性“地图”
- regex - pandas 正则表达式匹配必须是数字和文本
- python - 更改使用 Python 字典创建的对象的内存地址
- python-3.x - 对数字和字母的嵌套列表进行排序