提问人:demarshall 提问时间:12/13/2021 最后编辑:demarshall 更新时间:12/16/2021 访问量:431
Python Selenium:无法单击div/span复选框元素
Python Selenium Unable to click on div/span checkbox element
问:
这是我尝试单击的完整元素:
<div role="presentation" class="markAllContainer columnHeaderSelectAll" data-dyn-explicitcolumnwidth="custom" data-dyn-bind="
click: $data.ToggleMarkAllRecordsMode,
css: {
'is-loading': $data._isLoading
}
">
<div class="columnHeaderWrapper markingColumnHeader" role="columnheader">
<span class="marked-record-checkbox checkMarkTarget" role="checkbox" data-dyn-bind="
checked: $data.MarkAllRecords,
skip: $dyn.util.markAllSkip($data),
attr: {'aria-label': $dyn.label('Grid_SelectAllRowsShortcut')}" aria-checked="false" tabindex="-1" aria-label="Select all rows">
<span class="checkMarkGlyph checkMarkTarget Checkmark-symbol"></span>
<span class="boxGlyph checkMarkTarget"></span>
</span>
</div>
</div>
我尝试使用两者,并使用 WebDriverWait 单击树中的父元素以及每个子元素,以使该元素在 DOM 中可见。此元素是一个复选框,显示在页面顶部附近,因此不必滚动到它。为了测试各种点击方法,我在调试端口上打开了一个 Chrome 实例,它允许我一遍又一遍地在 selenium 中执行命令,而无需关闭/重新打开浏览器。由于我尝试自动化的网站的性质,这也是必要的。如果有任何帮助,这是在Microsoft的Dynamics 365中。ActionChains
element.click()
Chrome 窗口将使用以下控制台命令打开:
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\guest"
然后我用以下行在 python 中将驱动程序连接到它:
chrome_options = Co()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = Chrome(executable_path=chromedriver, options=chrome_options)
使用时出现错误(或)。ActionChains(driver).move_to_element(element).click().perform()
[object HTMLDivElement] has no size and location
HTMLSpanElement
使用我只是得到..click()
element not interactable
我还尝试使用以下命令:execute_script()
driver.execute_script("arguments[0].click();", element)
driver.execute_script("arguments[0].setAttribute('aria-checked', 'true')", element)
在上面的后一个示例中,选择的元素是具有以下特征的子元素:span
class="marked-record-checkbox checkMarkTarget"
element = driver.find_element_by_xpath("//span[@aria-label='Select all rows']")
但是,在这两种情况下,都没有发生任何事情,我也没有收到错误消息。我可以看到这个 span 元素也是具有事件侦听器的元素。所以我对为什么没有点击方法在这个元素上起作用感到双重困惑。
可以肯定的是,我当然可以手动单击此复选框。对此的任何帮助将不胜感激,如果我能在这里提供任何其他信息,请告诉我。我对 HTML/Selenium 不是很有经验。
编辑:以下是我为应该相关的 span 元素复制的样式(如前所述,它有事件侦听器):
font-style: normal;
font-variant: normal;
font-weight: 400;
border-collapse: collapse;
border-spacing: 0;
color: inherit;
user-select: none;
border: 0;
margin: 0;
padding: 0;
font-family: DynamicsSymbol;
font-size: 16px;
display: table;
width: 30px;
height: 30px;
cursor: pointer;
text-align: center;
我确实看到它没有指定“可见性”样式。难道这就是原因吗?如果是这样,我将如何向样式表添加“可见性”?
答:
我想通了!解决方案比我预期的要简单得多。我只需要将 xpath 查询扩展到更远的父元素。我在上面的问题中发布的元素只是复选框本身,所以我扩展了 xpath 以首先查看复选框所属的整个网格。这是对我有用的最后一个xpath:
"//div[@data-dyn-controlname='Grid']/div/div/div/div/div/span[@aria-label='Select all rows']"
我假设它以前不起作用,因为 DOM 中加载了多个具有相同标签的元素。@aria-label='Select all rows'
评论
is_displayed()