3

All I am trying to do is select the drop down & then select "Export Excel Spread Sheet".

Example of Drop Down

Code:

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)

I have tried so many different Xpaths & ID's

#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 Code

Click Me For HTML Example1

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

Take a look at the name in Example 1 vs Example 2

Click Me for HTML Example2

You'll notice the HTML Code has change to

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

Which I think is part of the problem I am having. Pretty Stuck. I have also tried to use ChroPath & XPath Helper to try and resolve the issue but no luck.

Thank you in Advance !

Update:

The Comments have asked for further detail of the HTML code & I have gathered the following 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>

Update 2 (Solution)

Here's where I went wrong. I didn't provide enough of the HTML code.

Just a few lines above there was an "iframe" which was not allowing me to enter the block of code.

After switching into the iframe, I was able to click into the button and complete the following task of exporting the excel report.

example of code (Generalized to your future endeavors)

#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()

CHECK YOUR HTML CODE FOR FRAMES !!!! good video to reference. https://www.youtube.com/watch?v=NhRx99uFUNk

General Grievance
  • 4,555
  • 31
  • 31
  • 45
Benny101
  • 63
  • 6
  • Post your html in text format.screenshot is very difficult to judge – KunduK Jun 28 '19 at 22:05
  • @pcalkins The full HTML code has been posted ! – Benny101 Jul 01 '19 at 03:39
  • @KunduK The full HTML code has been posted ! – Benny101 Jul 01 '19 at 03:39
  • @WillemVanOnsem The full HTML code has been posted ! – Benny101 Jul 01 '19 at 03:39
  • Looks like the markup is changing on hover, does the click work when you run this line "WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.ID, "Header-Dropdown-Menu")).click())"... (clean up the parentheses first...)? If so just follow up with an expectedcondition wait on the LI... If not, you may be seeing a stale element exception. This will be thrown before the timeout.. so you need to catch it and re-run. OR, switch to a "moveto" action instead of a click... use wait to get the element... then perform a moveto. That may be all that is needed to open the pulldown. – pcalkins Jul 01 '19 at 19:04
  • also, upon generating the hover on moveto, the click you send will also generate a hover... if the item in the pulldown changes on hover, you may need to take the same approach... either use moveto first, or catch the stale element exception and re-run. I believe the click action generates moveto (hover) first, then mousedown/mouseup on the same element. – pcalkins Jul 01 '19 at 19:17
  • it could also be changing while the pulldown populates its list... (if that is generated dynamically after hover/click) This would also throw stale element. (even on a moveto) – pcalkins Jul 01 '19 at 19:47
  • @pcalkins I appreciate the help you are providing. Thank you ! – Benny101 Jul 01 '19 at 20:53
  • @pcalkins I must say, I am somewhat a beginner in the following so I am a bit lost in what you're saying. Would you be able to write out the following so I can test it. Thank you ! – Benny101 Jul 01 '19 at 20:54
  • Never used Python before. What I do involves a "runaction" method in a class... the runaction executes the selenium WebDriverWait call in a try/catch... and if the type of exception thrown is "stale element" it calls "runaction(...)" again. Eventually the stale element error will not be thrown. (Hopefully... which is why I put in a int sanitycounter++... if the page has a constantly moving element, for instance, stale element will never stop...) – pcalkins Jul 01 '19 at 21:03