Python Selenium - 无法点击按钮

标签 python selenium selenium-webdriver selenium-chromedriver

我想做的就是选择下拉菜单,然后选择“导出 Excel 电子表格”。

Example of Drop Down

代码:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

url2 =["https://example.com/reports"]

driver = webdriver.Chrome()
driver.implicitly_wait(15)
driver.get("https://example.com")

for u in url2:
    driver.implicitly_wait(15)
    driver.get(u)

我尝试了很多不同的 Xpath 和 ID

#driver.find_element_by_xpath("//a[contains(@class,'dropdown__trigger header-export-menu--toggle-btn')]").click()
#driver.find_element_by_xpath("//li[contains(text(),'Export Excel Spread Sheet')]").click()
#act.click().perform()

#act.click(driver.find_element_by_xpath("//a[contains(@class,'dropdown__trigger header-export-menu--toggle-btn')]")).perform()

#act.move_to_element(driver.find_element_by_xpath("//a[contains(@class,'dropdown__trigger header-export-menu--toggle-btn')]")).perform()
#WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.ID, "Header-Dropdown-Menu")).click())
#driver.find_element_by_class_name("//div[contains(@class,'dropdown__content header-export-menu--content')]").click()

#driver.find_element_by_xpath('//div[@class="dropdown   header-export-menu" and @class="dropdown dropdown--active  header-export-menu"]')

#driver.quit()

HTML 代码

Click Me For HTML Example1

<!-- Under React Empty: 32 -->
<div class = "dropdown   header-export-menu">

看看示例 1 与示例 2 中的名称

Click Me for HTML Example2

您会注意到 HTML 代码已更改为

<!-- Under React Empty: 32 -->
<div class = "dropdown dropdown--active  header-export-menu"> 

我认为这是我遇到的问题的一部分。相当卡住了。 我也尝试过使用 ChroPath 和 XPath Helper 来尝试解决该问题,但没有成功。

提前谢谢您!

更新:

评论要求提供 HTML 代码的更多详细信息,我收集了以下 block 。

    <div class="header-container">
<!-- react-empty: 429 -->
<div class="header-event-info" id="header-event-info">
<div class="">
<div>
<div class="single-event-info">
<div class="event-data">
    <p class="data-dd">25</p>
    <p class="data-mmyy">Jun 2017</p>
    </div>
<div class="event-detail">
    <p class="event-name">"A name of a musical"</p>
    <p class="event-more-details">
<!-- react-text: 437 -->
"Tuesday, 7:00 pm, Some Theatre"
<!-- /react-text -->
<a class="popup" data-content="" data-icon="" data-position="bottom" data-width="350" data-height="auto" data-trigger="click" data-scrollable="false">
    <span class="popup-icon">                
        <svg width="19px" height="19px" viewBox="0 0 19 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">                    
            <desc>Created with sketchtool.</desc>                    
            <defs></defs>                    
        <g id="Totals-For-Today" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">                        
            <g class="svg-icon-path" id="01-Event-Audit-Narrow---No-TFT" transform="translate(-983.000000, -121.000000)" stroke="#919598">                            
                <g id="Group" transform="translate(27.500000, 15.560000)">                                
                    <g id="iButton" transform="translate(956.000000, 106.000000)">                                    
                    <path d="M9,17.4399996 C13.6944204,17.4399996 17.5,13.63442 17.5,8.93999958 C17.5,4.24557921 13.6944204,0.43999958 9,0.43999958 C4.30557963,0.43999958 0.5,4.24557921 0.5,8.93999958 C0.5,13.63442 4.30557963,17.4399996 9,17.4399996 Z" id="outline">
                    </path>                                    
                    <path class="svg-icon-text" d="M10.4765625,13.3169527 L7.68164062,13.3169527 L7.68164062,12.930234 C7.77148482,12.9224214 7.86425733,12.914609 7.95996094,12.9067965 C8.05566454,12.8989839 8.13867152,12.8833591 8.20898438,12.8599215 C8.31835992,12.824765 8.3994138,12.7632422 8.45214844,12.6753511 C8.50488308,12.5874601 8.53125,12.4732034 8.53125,12.3325777 L8.53125,8.76421833 C8.53125,8.63921771 8.50292997,8.52496104 8.44628906,8.42144489 C8.38964815,8.31792875 8.31054738,8.23101556 8.20898438,8.16070271 C8.13476525,8.11382747 8.02734445,8.07378881 7.88671875,8.04058552 C7.74609305,8.00738223 7.61718809,7.98687462 7.5,7.97906208 L7.5,7.59820271 L9.5390625,7.46929646 L9.62109375,7.55132771 L9.62109375,12.2622652 C9.62109375,12.3989846 9.64746067,12.5122648 9.70019531,12.602109 C9.75292995,12.6919532 9.83593693,12.7583587 9.94921875,12.8013277 C10.0351567,12.8364841 10.1191402,12.8648042 10.2011719,12.8862886 C10.2832035,12.9077731 10.3749995,12.9224214 10.4765625,12.930234 L10.4765625,13.3169527 Z M9.73828125,5.18999958 C9.73828125,5.41265694 9.66503979,5.60699094 9.51855469,5.77300739 C9.37206958,5.93902385 9.19140732,6.02203083 8.9765625,6.02203083 C8.77734275,6.02203083 8.60449292,5.94293006 8.45800781,5.78472614 C8.31152271,5.62652223 8.23828125,5.44585997 8.23828125,5.24273396 C8.23828125,5.02788913 8.31152271,4.84039101 8.45800781,4.68023396 C8.60449292,4.5200769 8.77734275,4.43999958 8.9765625,4.43999958 C9.19921986,4.43999958 9.38183522,4.51519414 9.52441406,4.66558552 C9.6669929,4.81597689 9.73828125,4.99077983 9.73828125,5.18999958 L9.73828125,5.18999958 Z" id="i-2-copy-2" stroke-width="0.25" fill="#919598"></path>                                
                    </g>                            
                </g>                        
            </g>                    
        </g>                
    </svg>            
</span>
</a>
</p>
</div>
</div>
<div class="header-export">
<!-- react-empty: 32 -->
<div class="dropdown dropdown--active  header-export-menu">
    <a class="dropdown__trigger header-export-menu--toggle-btn">
        <svg width="9px" height="5px" viewBox="0 0 9 5" version="1.1">
            <desc>Created with Sketch.</desc>
            <defs></defs>
            <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
                <g id="Artboard" transform="translate(-109.000000, -97.000000)" fill="#FFFFFF">
                    <g id="Header-Dropdown-Menu" transform="translate(96.000000, 82.000000)">
                <path d="M18.1734867,19.6470682 C17.8014721,20.0543213 17.1922167,20.0476427 16.8263028,19.6470682 L13.2549246,15.7373969 C12.8829101,15.3301438 13.0295754,15 13.5787039,15 L21.4210856,15 C21.9719185,15 22.1107787,15.3368224 21.7448649,15.7373969 L18.1734867,19.6470682 Z" id="options-dropdown-menu-arrow"></path>
                    </g>
                </g>
            </g>
        </svg>
    </a>
<div class="dropdown__content header-export-menu--content">
    <ul class="export-menu">
        <li class="export-menu-item  ">
            <svg width="17px" height="14px" viewBox="0 0 17 15" version="1.1">
            <desc>Created with Sketch.</desc>
            <defs></defs>
            <g id="Basic-Report-Template-SPECS" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
                <g id="Basic-Report-Template---EXPORT-SPECS-OnClick" transform="translate(-522.000000, -180.000000)" stroke="#484B4D" stroke-width="2">
                    <g id="SPECS" transform="translate(487.000000, 14.000000)">
                        <g id="Download-Icon-Copy-2" transform="translate(43.500000, 172.000000) rotate(-180.000000) translate(-43.500000, -172.000000) translate(35.000000, 164.000000)">
                            <path d="M5.36902902,13.624518 L5.36902902,6.56257607 L12.430971,6.56257607" id="Rectangle-242-Copy-5" transform="translate(8.900000, 10.093547) rotate(-315.000000) translate(-8.900000, -10.093547) "></path>
                            <path d="M8.9,6.99999999 L8.9,12.9999999" id="Line-Copy-10" stroke-linecap="square"></path>
                            <path d="M16.9,0.0208873076 L16.9,4.02297419 C16.9,5.12639113 16.0054862,6.02088731 14.9059397,6.02088731 L2.89406028,6.02088731 C1.7927712,6.02088731 0.9,5.12262668 0.9,4.02297419 L0.9,0.0208873076" id="Rectangle-243-Copy-4" transform="translate(8.900000, 3.020887) rotate(-180.000000) translate(-8.900000, -3.020887) "></path>
                        </g>
                    </g>
                </g>
            </g>
            </svg>
            <!-- react-text: 55 -->
            "Export PDF"
            <!-- /react-text -->
            </li>
            <li class="export-menu-item">
                <svg width="17px" height="14px" viewBox="0 0 17 15" version="1.1">
                <desc>Created with Sketch.</desc>
                <defs></defs><g id="Basic-Report-Template-SPECS" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
                <g id="Basic-Report-Template---EXPORT-SPECS-OnClick" transform="translate(-522.000000, -180.000000)" stroke="#484B4D" stroke-width="2">
                    <g id="SPECS" transform="translate(487.000000, 14.000000)">
                    <g id="Download-Icon-Copy-2" transform="translate(43.500000, 172.000000) rotate(-180.000000) translate(-43.500000, -172.000000) translate(35.000000, 164.000000)">
                        <path d="M5.36902902,13.624518 L5.36902902,6.56257607 L12.430971,6.56257607" id="Rectangle-242-Copy-5" transform="translate(8.900000, 10.093547) rotate(-315.000000) translate(-8.900000, -10.093547) "></path>
                        <path d="M8.9,6.99999999 L8.9,12.9999999" id="Line-Copy-10" stroke-linecap="square">
                        </path>
                        <path d="M16.9,0.0208873076 L16.9,4.02297419 C16.9,5.12639113 16.0054862,6.02088731 14.9059397,6.02088731 L2.89406028,6.02088731 C1.7927712,6.02088731 0.9,5.12262668 0.9,4.02297419 L0.9,0.0208873076" id="Rectangle-243-Copy-4" transform="translate(8.900000, 3.020887) rotate(-180.000000) translate(-8.900000, -3.020887) 
                        "></path>
                        </g>
                    </g>
                </g>
            </g>
            </svg>
            <!-- react-text: 79 -->
            "Export Excel Spread Sheet"
            <!-- /react-text -->
            </li>
        <li class="export-menu-item  ">
            <svg width="16px" height="12px" viewBox="0 0 16 13" version="1.1">
                <desc>Created with Sketch.</desc>
                <defs></defs>
            <g id="Basic-Report-Template-SPECS" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
                <g id="Basic-Report-Template---EXPORT-SPECS-OnClick" transform="translate(-554.000000, -182.000000)" stroke="#484B4D" stroke-width="2">
                    <g id="SPECS" transform="translate(487.000000, 14.000000)">
                        <g id="Email-Icon-Copy" transform="translate(67.000000, 168.000000)">
                            <rect id="Rectangle-40" x="0" y="0.669998169" width="16" height="11" rx="2"></rect>
                            <path d="M1.55761719,3.08300781 L8.07275391,7.10009766 L14.8974609,3.14355469" id="Path-41"></path>
                            </g>
                        </g>
                    </g>
                </g>
            </svg>
            <!-- react-text: 90 -->
            "Email/Schedule Report"
            <!-- /react-text -->
        </li>
    </ul>
</div>
</div>

更新2(解决方案)

这就是我出错的地方。 我没有提供足够的 HTML 代码。

上面的几行有一个“iframe”,它不允许我输入代码块。

切换到 iframe 后,我可以点击按钮并完成以下导出 Excel 报告的任务。

代码示例(概括为您 future 的努力)

#Finding the Frame
iframes = driver.find_element_by_id("IDofFrame")

#Switching to that frame
driver.switch_to.frame(iframes)

#Finding the dropdown button element
driver.find_element_by_xpath("XPathOfButton").click()

#delay on the export click
time.sleep(3)

#Export click
driver.find_element_by_xpath("XPathOfButtonToExport").click()

#If you need to switch out of the frame to go back to the original HTML block
driver.switch_to.default_content()

检查您的 HTML 代码是否有框架!!!! 不错的视频,可以引用。 https://www.youtube.com/watch?v=NhRx99uFUNk

最佳答案

实际上你的每一次尝试都是错误的。

driver.find_element_by_xpath("//li[contains(text(),'Export Excel Spread Sheet')]").click()

这里您使用的是contains(text())如果您传递 text() 选择的节点集,这实际上是不正确的至 contains() ,就像您所做的那样,然后通过获取节点集中第一个节点的字符串值,将其转换为字符串,而在 HTML 中我可以看到 <svg><li> 的第一个内部节点元素,我建议尝试使用点 .这将获取节点内的所有字符串值 explicit wait :

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

wait = WebDriverWait(driver, 10)


element = wait.until(EC.presence_of_element_located((By.XPATH, "//li[contains(.,'Export Excel Spread Sheet')]")))
element.click()

希望对你有帮助

关于Python Selenium - 无法点击按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56813415/

相关文章:

python - 在 Pycharm 控制台正确执行代码时从系统控制台获取错误

java - 将 C# 中的 "auto property"转换为 Java 替代代码

python - 保存和加载 selenium 的浏览器历史记录

python - 处理 JSON 中的错误转义字符

python - 从 QValidator 获得视觉反馈

python - 从 scikit-learn 训练 SVC 表明使用 -h 0 可能会更快?

java - 为什么在尝试使用 Selenium 打开网站时出现 GridException

java - 如何通过 selenium 从多行 <tag> 中检索文本

c# - 在启动 Appium session 之前获取可用设备列表

python - 如何使用 beautifulsoup 和 selenium 在 Python Scraping 中识别类名或 id