【发布时间】: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&Version=11.0.7001.0&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&Version=11.0.7001.0&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&Version=11.0.7001.0&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&Version=11.0.7001.0&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