python - 硒中的元素过时或不可点击错误
问题描述
作为预警,我对编写代码非常陌生,只是将其作为一种爱好,所以如果我的术语不正确,我深表歉意。
我编写了一些代码来导航到网页,然后一遍又一遍地刷新该页面,直到出现某个元素(当前是一个类),然后单击该类。我不需要网站导航部分的帮助(该网站上的其他问题和答案对于找出该过程中的症结非常有帮助),但是当元素最终出现并且 selenium 尝试单击该元素时,我经常收到错误消息. 我看到一些不同的错误消息,包括:
- h4 class="start" 的元素引用是陈旧的;要么元素不再附加到 DOM,它不在当前框架上下文中,要么文档已被刷新;或者
- 元素在点 (706,145) 处不可点击,因为另一个元素 li class="loading-wrapper loading" 将其遮盖了。
这是代码的相关部分:
i = 0
while i == 0:
if len(driver.find_elements_by_class_name("start")) == 0:
driver.find_element_by_class_name("active.day").click() #this just refreshes the page
time.sleep(0.1)
continue
else:
break
driver.find_elements_by_xpath("//*[@class='start' and starts-with(text(), '7')]")[0].click()
这是我尝试单击的“开始”元素出现之前网站相关部分的示例:
<div id="content" class="row">
<ul id="times" class="col-md-12">
<li class="time empty muted">
<h1>No tee times available</h1>
<p>Booking for 8/09/2020 starts at 7:00pm (PDT)</p>
</li>
</ul>
</div>
这是我尝试单击的“开始”元素出现后 HTML 相关部分的示例:
<div class="reserve-time">
<div class="pull-left">
<h4 class="start">7:38am</h4>
<div class="holes" style="margin-right: 0.5em;">
<i class="glyphicon glyphicon-flag"></i> <span class="holes">18</span>
</div>
<div class="spots">
<i class="glyphicon glyphicon-user"></i> <span class="spots">3</span>
</div>
</div>
<div class="pull-right">
<div class="price">
<span title="Green Fee">
<i class="icon-golf-ball-tee" style="font-size: 1em;"></i>
$33.00
</span>
</div>
</div>
</div>
提前感谢您的帮助!
PS - 我希望 HTML 在帖子中显示正常。我无法将 HTML 复制到帖子中并显示出来。
解决方案
Selenium 无法单击它看不到的对象 - 就像您无法单击网页上看不到的东西一样。在调试 Selenium 代码时,我所做的是在崩溃的行之前添加一个“睡眠”10 分钟。然后,在打开的浏览器中,我查看我尝试单击的元素是否可访问。
在您的情况下,听起来好像有一个加载屏幕遮住了它。我建议不要使用显式休眠 ( time.sleep(0.1)
),而是webdriver.implicitly_wait(10)
等待 10 秒以使元素可见。如果这不起作用,请考虑上面的调试方法,您可以在浏览器中实际尝试一下。
推荐阅读
- git - 在 git 中添加不在 GitHub 或 anyHub 上的远程
- javascript - 如何在 Angular 中使用 json2html 和 jquery?
- jsf - 通过 BootsFaces 数据表获取传递给 Java 函数的空值
- google-chrome-devtools - 在 Chrome 开发工具中禁用断点的快捷方式是什么?
- assembly - 大会 - 部门给出奇怪的结果
- python - Groupby 和 cumcount 仅适用于有效行
- python - 获取文件中出现单词的行?
- authentication - 是否可以通过检查 Kerberos 数据包来确定用户如何进行身份验证?
- c++ - 在字符串中插入一个字符
- azure - Azure 应用服务:如果当前实例计数高于所选实例怎么办?