【问题标题】:Python Selenium click the button once a drop-down menu is available一旦下拉菜单可用,Python Selenium 单击按钮
【发布时间】:2020-11-03 16:33:14
【问题描述】:

有一个“导出下拉菜单按钮”可以处于活动状态:

<a id="ctl32_ctl05_ctl04_ctl00_ButtonLink" title="Export drop down menu" alt="Export drop down menu" href="javascript:void(0)" style="text-decoration: none; cursor: pointer;">
    <img id="ctl32_ctl05_ctl04_ctl00_ButtonImg" src="/Reports/Reserved.ReportViewerWebControl.axd?OpType=Resource&amp;Version=11.0.7001.0&amp;Name=Microsoft.Reporting.WebForms.Icons.Export.gif" alt="Export drop down menu" style="border-style:None;height:16px;width:16px;border-width:0px;">
    <span style="width:5px;text-decoration:none;"> </span>
    <img id="ctl32_ctl05_ctl04_ctl00_ButtonImgDown" src="/Reports/Reserved.ReportViewerWebControl.axd?OpType=Resource&amp;Version=11.0.7001.0&amp;Name=Microsoft.Reporting.WebForms.Icons.ArrowDown.gif" alt="Export drop down menu" style="border-style:None;height:6px;width:7px;border-width:0px;margin-bottom:5px;">
</a>

或不活动:

<a id="ctl32_ctl05_ctl04_ctl00_ButtonLink" title="Export drop down menu" alt="Export drop down menu" href="javascript:void(0)" style="text-decoration: none; cursor: default;">
    <img id="ctl32_ctl05_ctl04_ctl00_ButtonImg" src="/Reports/Reserved.ReportViewerWebControl.axd?OpType=Resource&amp;Version=11.0.7001.0&amp;Name=Microsoft.Reporting.WebForms.Icons.ExportDisabled.gif" alt="Export drop down menu" style="border-style:None;height:16px;width:16px;border-width:0px;">
    <span style="width:5px;text-decoration:none;"> </span>
    <img id="ctl32_ctl05_ctl04_ctl00_ButtonImgDown" src="/Reports/Reserved.ReportViewerWebControl.axd?OpType=Resource&amp;Version=11.0.7001.0&amp;Name=Microsoft.Reporting.WebForms.Icons.ArrowDownDisabled.gif" alt="Export drop down menu" style="border-style:None;height:6px;width:7px;border-width:0px;margin-bottom:5px;">
</a>

如果您在按钮处于活动状态时单击它,您会看到一个下拉菜单:

按钮激活前的等待时间可能会有很大差异(从几秒到几分钟不等)。最后,我需要单击下拉菜单中的一个选项,但在按钮处于活动状态且可单击之前我无法到达那里1。

我目前的实现是:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ... 
wait_long = WebDriverWait(chrome_driver, 360)
export_button = wait_long.until(EC.element_to_be_clickable((By.XPATH, '//*[@title="Export drop down menu"]')))
export_button.click()

wait_5 = WebDriverWait(chrome_driver, 5)
csv_button = wait_5 .until(EC.visibility_of_element_located((By.XPATH, '//*[@title="CSV (comma delimited)"]')))
csv_button.click()

这个实现的问题是按钮可以立即点击,所以export_button 会被立即点击,但由于它处于非活动状态,因此不会显示下拉菜单。 chrome_driver 有没有办法等到按钮真正可点击?

我注意到按钮的两种状态都用不同的文件表示:Export.gif 表示活动,ExportDisabled.gif 表示非活动。可能可以编写自定义等待条件 (https://selenium-python.readthedocs.io/waits.html#explicit-waits),但我发现它几乎不是一个优雅的解决方案。有没有办法以另一种(更简单)的方式实现我想要的行为?

1 根据我观察到的 Selenium 的行为,该按钮始终是可点击的。它处于活动状态和非活动状态之间的唯一区别在于,在后者中,一旦单击按钮,下拉菜单就不会显示。

【问题讨论】:

  • 请在启用和禁用状态下发布图标的HTML。这是我们为它创建定位器所必需的。

标签: python html selenium selenium-webdriver


【解决方案1】:

如果没有 HTML,就不可能为您提供一个可以在您的网站上使用的实际定位器,但我会制作一个我猜应该很接近的定位器,并希望为您指明正确的方向。

这是我的模拟 HTML:

<a href="...">
    <img src="../Export.gif">
</a>

鉴于 HTML,我们可以编写 CSS 选择器

a > img[src$='Export.gif']

现在您可以在 WebDriverWait 中使用它

export_button = wait_long.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a > img[src$='Export.gif']")))

现在这行会等到图标启用,基于 gif,然后你可以点击它。

注意:在禁用和启用状态下发布图标的 HTML 并向我发送消息,我会回来将其更新为真正的 HTML。


现在实际的 HTML 已经发布,模拟 HTML 是正确的,定位器实际上可以工作。我可能会稍作调整以使其更具体,但可能没有必要。

a[title="Export drop down menu"] > img[src$="Export.gif"]

你可以尝试两个/一个看看。

【讨论】:

  • @balkon16 我在答案中添加了一些内容,但原始定位器和代码应该可以工作。如果您愿意,您也可以尝试其他定位器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多