当前位置: 首页 > 知识库问答 >
问题:

Selenium(Python)-启用后点击禁用按钮[重复]

华宇
2023-03-14

我正在使用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()

但这会给出一个超时异常。那么我应该怎么做才能在它变得可点击后点击这个按钮。我尝试过一些来自互联网的解决方案,但似乎都不奏效。

共有3个答案

石超
2023-03-14

如您所见,按钮元素在仍处于禁用状态时包含类已禁用,包含属性已禁用,启用时不包含这些属性
因此,预期的条件是定位由以下xpath定义的元素:

//button[@id='upload-button' and(not(contains(@class,'is-disabled'))) and(not(@disabled))]

换句话说,您应该使用以下内容:

WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.XPATH, "//button[@id='upload-button' and(not(contains(@class,'is-disabled'))) and(not(@disabled))]")))

您也可以基于缺少上述两个属性中的一个来定位启用按钮。

山疏珂
2023-03-14

似乎您使用了错误的ID值。

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

或者使用这个css选择器

WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#upload-button[data-is-focusable='true']"))).click()
颛孙昆
2023-03-14

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

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

您正在等待此元素可单击。我想试着弄清楚这到底意味着什么,所以我查看了源代码<只要元素“可见”和“已启用”,代码>元素可点击即满足要求。

可见性,我知道,被定义为DOM上的存在和高度/宽度

这就引出了一个问题,究竟是什么决定了一个元素是否被“启用”?我发现selenium的已启用(源代码中要求元素可点击才能通过),本质上是W3C规范对禁用()的否定。归结起来就是这一行,它表示如果元素是按钮、输入、选择、文本区域或表单关联的自定义元素,并且在该元素上指定了disabled属性(无论其值如何),则该元素为“disabled”

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

至于你的班名,

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

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

最后,您是否打算通过单击按钮从文件系统上载?因为它只能与您的web浏览器交互,并且不能浏览操作系统上的窗口,所以这不起作用。上传文件有一种特殊的方式——您必须识别文件输入元素,并使用send\u keys()将要上传的文件的绝对路径发送到该元素。

 类似资料:
  • 我想做的就是选择下拉列表。 下拉列表示例 代码: 我已经尝试了很多不同的Xpaths HTML代码 单击我查看HTML示例1 看看例1和例2中的名字 单击我为超文本标记语言实例2 您会注意到 HTML 代码已更改为 我认为这是我面临的问题的一部分。真是卡住了。我也尝试过使用ChroPath 提前谢谢你! 更新: 评论要求提供超文本标记语言代码的更多细节 更新2(解决方案) 我错在这里。我没有提供足

  • 我正在尝试单击GetData按钮并获取输出,但这对我不起作用。不知道我该怎么做。

  • 编辑:底部的解决方案 这是一个跳棋游戏。单击一个按钮后,它等待单击第二个按钮与之交换。然而,有时你可能不想移动那个按钮,但一旦你点击了它,就没有回头路了,因为我无法禁用它。 在这里的其他帖子中,我看到人们使用 这只是使它在第一次单击后不可见。 这什么都干不了。 这也没什么用。编辑:所有这些方法都用true和false进行了尝试。 私有无效交换(){ 但你也需要 这样它就重新启用了它,或者其他什么,

  • 我想单击以下按钮: https://i.stack.imgur.com/ifiDC.png 到目前为止,我的代码看起来像这样,但什么也没发生: https://i.stack.imgur.com/Cgi5v.png 谢谢你的帮助:)

  • 图像中标记的元素:- 我尝试了许多方法,例如: 上述元素的X_path:"/html/body/div/div[3]/div/div/div[4]/div/div/form/div/div[3]/p/img" 但是以上似乎都没有点击按钮并获取页面上的数据。 我的代码:-

  • 问题内容: 提交表单时,我正在使用jquery $ .post。我想在单击按钮后禁用按钮约5秒钟,以避免多次提交表单。 这是我现在所做的: 我之前使用了fadeIn和fadeOut,但是当我快速测试单击按钮时仍然无法正常工作。我应该怎么做才能实现自己想实现的目标? 问题答案: 您可以这样操作: 或者您可以使用ajax收到响应后正在执行的jQuery 方法: 编辑: 这是一个 3秒钟服务器端响应延迟