【发布时间】:2019-06-10 02:13:37
【问题描述】:
这是我尝试根据“检查”点击的元素的所有部分:
<div class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix">
::before
<div class="ui-dialog-buttonset">
<button type="button" class="done ui-button ui-corner-all ui-widget">
Done</button>
</div>
::after
</div>
当我想点击它时,我假设它位于::before 部分,因为它正在显示并可点击。在代码中,我确保滚动并等待两秒钟,然后单击以确保按钮可见,但我得到:
selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable
但我不明白它是如何不可交互的。当我在检查器中将鼠标悬停在它上面时,<button>...</button> 中的所有内容都会突出显示,所以我要单击的按钮必须在那里,对吧?
以下是我尝试过的几件事:
browser.find_element_by_css_selector('button[type=button]').click()
browser.find_elements_by_xpath("//*[contains(text(), 'Done')]").click()
# The above returns a list for some reason?
browser.find_elements_by_css_selector('done.ui-button.ui-corner-all.ui-widget')
我希望我能记住我尝试过的所有事情,但无论如何我希望有人能帮助我。
【问题讨论】:
-
尽可能显示你的源页面,否则其他人无法调试帮助。此外,selenium 可以执行脚本,您可以尝试使用 javascript 或 jquery 脚本来使元素可交互,甚至可以使用它们完成所有步骤。
-
当你使用
.find_elements(注意复数)时,它会返回一个列表而不是像.find_element(单数)那样的单个元素。你试过browser.find_element_by_xpath("//button[.='Done']")吗?如果您在这些.find_elements呼叫中获得len()... 是1?我想知道与您正在使用的定位器匹配的按钮是否不超过一个,并且第一个不可见,但您想要第二个或第三个,等等。 -
@JeffC Jeff 我的朋友,你真的是我的英雄。我在该列表中单击了一个特定元素,它工作得非常好。用这个回答这个问题,这样你我就可以给你一个复选标记来给我答案。你值得拥有一切。
-
@jeepersmcface ,请注意在
ElementNotVisibleException的情况下,这种方法(使用find_elements_..)应仅用于检查选择器匹配的元素数量,而不是通过索引选择所需元素。您仍然应该搜索唯一选择器。 -
同意@Andersson。我猜表格中有多个按钮,每个按钮都在不同的行上。您应该能够根据表中的值为给定按钮构造 XPath。这是执行此操作的更好方法……我的评论变成了答案,更像是一个调试步骤。好吧,它不一定是表格中的一行,这只是一个例子......
标签: python selenium xpath css-selectors webdriverwait