【问题标题】:Selenium (Python) - click on disabled button after it is enabled [duplicate]Selenium(Python)-启用后单击禁用按钮[重复]
【发布时间】:2021-08-03 04:09:05
【问题描述】:

我正在使用 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 的解决方案,但似乎都没有工作。

【问题讨论】:

  • By.CSS_SELECTOR 怎么样?
  • @MuhdMairaj 我也试过了......没有运气。我什至尝试过使用 XPATH。
  • 您从哪里获得此 ID 值 profile.edit-picture.save-button 。 ID 应该是这个upload-button
  • @KunduK 哦,对不起......我在这里粘贴了错误的代码......这是我的错误......我现在就编辑它...... ...我在 id 中使用“上传按钮”
  • @AnshulVerma:有什么解决方案适合你吗?

标签: python selenium selenium-webdriver automation


【解决方案1】:

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

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

您正在等待此元素成为clickable。我想尝试弄清楚这到底意味着什么,所以我查看了源代码。 element_to_be_clickable满意As soon as the element is "visible" and "enabled"

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

这就引出了一个问题,究竟是什么决定了一个元素是否“启用”?我发现 selenium 的is_enabled(源代码中需要element_to_be_clickable 才能通过),本质上是对W3C specification for 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() 将要上传的文件的绝对路径发送到该元素。

【讨论】:

  • 你说得对,“root-437”是一个动态类。我检查了它,它被更改为“root-437”。这就是我不能点击按钮的原因吗?另外....关于上传文件...我已经通过使用browser.find_element(By.CSS_SELECTOR,"input[type='file']").send_keys(cwd+"\\images\\1.jpg") 解决了这个问题所以....我怎么能点击这个按钮....我还是不明白
  • 很高兴知道该类不是动态的,这很有帮助。我在你的第一篇文章中没有看到关于文件上传的内容,很抱歉提出这个问题。正如我上面所说,为了调试它,我会尝试在执行WebDriverWait 之后和单击按钮之前临时添加一个硬等待,几秒钟之久。
  • 你说的苦等待是什么意思??您是指隐式等待还是 time.sleep(10)?这两种我都试过了。
  • time.sleep(10)。要弄清楚这一点,最重要的是我们没有页面的 HTML 或指向它的链接。您的一个或多个元素是否可能在 iframe 中?
  • 请尽量避免讽刺和屈尊。我知道这个问题令人沮丧,但有很多人花时间希望能解决这个问题。
【解决方案2】:

您似乎使用了错误的 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()

【讨论】:

  • 我最初使用的是正确的 ID 值....但后来我测试了一下并在此处粘贴了错误的 ID....虽然我现在已经编辑了它。此外,使用 css 选择也不起作用.....它给出了 TimeOut 异常。
  • CSS 选择器作为方法不能是超时异常的原因。原因可能是选择器错误。没关系cssxpath
  • Kunduk 建议的选择器是正确的。使用更多数据更新您的问题。
【解决方案3】:

如您所见,按钮元素在仍处于禁用状态时包含类is-disabled 和属性disabled,启用时不包含这些属性。
所以预期的条件是定位到下面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))]")))

您也可以根据所提到的两个属性之一的缺失来定位启用的按钮。

【讨论】:

  • 我试过了,但没用。虽然没有显示错误。那么这是否意味着找到了 Enabled Button 的存在?但是当我告诉代码点击它时......它不起作用......程序只是终止而没有任何错误。
  • 您是否尝试过等待该元素可点击?我的意思是根据没有禁用的属性来定位它并且这个元素是可点击的?还是可见的?
  • 是的....刚刚做了....它不起作用
  • 真的很奇怪。在真实网页上调试它会很有趣,但我不能......
  • 这可能类似于 google 的更改个人资料图片选项。你认为这有帮助吗?
【解决方案4】:

尝试点击不显式等待,使用隐式:

driver.implicitly_wait(15)
driver.find_element_by_xpath('//button[@data-is-focusable="true"]').click()

或者

driver.implicitly_wait(15)
driver.find_element_by_xpath('//button[@data-is-focusable="true" and @tabindex="0"]').click()

如果这没有帮助,请在您的问题中添加更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2011-01-20
    相关资源
    最近更新 更多