Python Selenium:无法单击div/span复选框元素

Python Selenium Unable to click on div/span checkbox element

提问人:demarshall 提问时间:12/13/2021 最后编辑:demarshall 更新时间:12/16/2021 访问量:431

问:

这是我尝试单击的完整元素:

<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中。ActionChainselement.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 locationHTMLSpanElement

使用我只是得到..click()element not interactable

我还尝试使用以下命令:execute_script()

driver.execute_script("arguments[0].click();", element)
driver.execute_script("arguments[0].setAttribute('aria-checked', 'true')", element)

在上面的后一个示例中,选择的元素是具有以下特征的子元素:spanclass="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;

我确实看到它没有指定“可见性”样式。难道这就是原因吗?如果是这样,我将如何向样式表添加“可见性”?

python selenium microsoft-dynamics chrome-web-driver

评论

0赞 demarshall 12/13/2021
经过一些简短的额外调查,我发现该结构中的所有元素都根据硒“未显示”,使用该方法。所以现在的问题是,我怎样才能强制显示这些元素?即使我可以清楚地看到它们并手动与它们交互。is_displayed()

答:

0赞 demarshall 12/16/2021 #1

我想通了!解决方案比我预期的要简单得多。我只需要将 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'