Python Selenium-无法单击按钮(iFrame已解决!)

时间:2019-06-28 21:38:37

标签: 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代码的更多详细信息,并且我收集了以下内容。

    <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报告的任务。

代码示例(根据您的未来需求而定)

查找框架

iframes = driver.find_element_by_id(“ IDofFrame”)

切换到该帧

driver.switch_to.frame(iframe)

查找下拉按钮元素

driver.find_element_by_xpath(“ XPathOfButton”)。click()

导出延迟

time.sleep(3)

导出点击

driver.find_element_by_xpath(“ XPathOfButtonToExport”)。click()

如果您需要跳出框架以返回到原始HTML块

driver.switch_to.default_content()

检查您的HTML代码以获取框架!!!!

好视频供参考。 https://www.youtube.com/watch?v=NhRx99uFUNk

1 个答案:

答案 0 :(得分:0)

实际上,您的每次尝试都是错误的。

  

driver.find_element_by_xpath(“ // li [包含(text(),'导出Excel   电子表格')]“)。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()

希望有帮助