首页 > 解决方案 > Selenium (Python) - 启用后单击禁用按钮

问题描述

我正在使用 Selenium 和 Python 来自动执行上传文件的过程。有一个“上传”按钮,默认情况下是禁用的,只有在选择要上传的文件时才可以点击。

禁用按钮的 HTML 是 -

<button type="button" id="upload-button" data-bi-id="upload-button" class="ms-Button ms-Button--primary is-disabled root-296" disabled="" aria-label="Upload" aria-disabled="true" data-is-focusable="false">

按钮变为可点击后的 HTML 是 -

<button type="button" id="upload-button" data-bi-id="upload-button" class="ms-Button ms-Button--primary root-437" aria-label="Upload" data-is-focusable="true" tabindex="0">

我在用 -

WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.ID,"upload-button"))).click()

但它不起作用。我相信这是单击禁用的按钮(即使选择了文件并且该按钮已变为可单击)。我也试过——

WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.CLASS_NAME,"ms-Button ms-Button--primary root-437"))).click()

但这给出了一个TimeOut Exception. 那么当这个按钮变成可点击后我应该怎么做才能点击它呢?我尝试了一些来自 Internet 的解决方案,但它们似乎都不起作用。

标签: pythonseleniumselenium-webdriverautomation

解决方案


关于您的代码的当前版本,我认为您可能是正确的,它在真正启用之前单击了按钮。你有

WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.ID,"upload-button"))).click()

您正在等待这个元素成为clickable. 我想尝试弄清楚这到底意味着什么,所以我查看了源代码。只要元素是“可见的”和“启用的”,就element_to_be_clickable满足了。

我知道,可见性被定义为 DOM 上的存在和高度/宽度都 > 0。从您的描述中,听起来您的按钮立即可见。因此,只要它“启用”,element_to_be_clickable就满足了,等待就会结束。

这就引出了一个问题,究竟是什么决定了一个元素是否“启用”?我发现 selenium is_enabled(源代码中element_to_be_clickable需要通过),本质上是对W3C 规范disabled()的否定。它归结为这一行,它表明一个元素是“禁用的”,如果The element is a button, input, select, textarea, or form-associated custom element, and the disabled attribute is specified on this element (regardless of its value).

而已。您的元素确实具有“禁用”属性,但它也有一些其他可能导致它被禁用的东西——类名包含is-disabled、它的aria-disabled="true"以及data-is-focusable="false",所有这些都在按钮完全可单击时发生变化。我想知道 disabled 属性是否会在其他也会导致元素被禁用的东西之前消失,所以就像你说的那样,你的点击可能在按钮准备好之前就注册了。WebDriverWait为了调试这个,我会尝试在执行之后和点击按钮之前临时添加一个硬等待,几秒钟。

对于您的班级名称,

WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.CLASS_NAME,"ms-Button ms-Button--primary root-437"))).click()

我怀疑这是一个动态类名,root-437尤其是部分,所以也许这就是为什么它不起作用。

最后,您是否打算通过单击按钮从文件系统上传?因为它只能与您的网络浏览器交互,而不能浏览您操作系统上的窗口,所以这是行不通的。上传文件有一种特殊的方式——您必须识别文件输入元素并使用send_keys().


推荐阅读