2017-12-12 3 views
1

Ich arbeite an einem Programm, mit dem ich die zweite Option im Dropdown-Menü auf https://www.pcfinancial.ca/ in der oberen rechten Ecke des Fensters auswählen kann. Hier ist mein Code so weit:Klicken Sie nicht auf Element mit Python Selenium

import time 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support import ui 

driver = webdriver.Chrome() 

driver.get('https://www.pcfinancial.ca/'); 
driver.find_element_by_xpath('//*[@id="lnkSignInOp"]').click() #click on dropdown menu - working 
driver.find_element_by_xpath('//*[@id="PCM"]/a').click() #select "pc mastercard" - not working 

Was komisch ist, ich das Dropdown-Menü zugreifen kann, die erste driver.find_elements_by_xpath(...) Linie verwenden, aber ich bekomme die folgende Fehlermeldung, wenn die zweite Option auswählen.

Traceback (most recent call last): 
    File "C:\Users\Imad\Documents\Programming\Python\test.py", line 10, in <module> 
    driver.find_element_by_xpath('//*[@id="PCM"]/a').click() #open up dropdown menu works 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click 
    self._execute(Command.CLICK_ELEMENT) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 501, in _execute 
    return self._parent.execute(command, params) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 308, in execute 
    self.error_handler.check_response(response) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible 
    (Session info: chrome=63.0.3239.84) 
    (Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 10.0.16299 x86_64) 

Kann jemand mir helfen zu verstehen, was los ist und wie man das beheben kann? Danke im Voraus!

Antwort

2

Dies ist der klassische Fall einer Timing-Ausgabe. Nachdem Sie das Drop-Down öffnen, warten Sie auf den Menü-Link mit WebDriverWait und element_to_be_clickable erwarteten Zustand anklickbar zu sein:

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 


driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10) 

driver.get('https://www.pcfinancial.ca/') 
driver.find_element_by_xpath('//*[@id="lnkSignInOp"]').click() 


wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#PCM a"))).click() 
+0

Vielen Dank! Ich hatte keine Ahnung, dass nach dem Laden der Webseite eine Wartezeit erforderlich ist. Wie für WebDriverWait, wissen Sie, in welcher Einheit die 10 ist? Frage nur aus Neugier, damit ich weiß, was beim nächsten Mal "zu lang" ist –

+1

@ImadKalboneh kein Problem, froh, dass es für Sie gearbeitet hat. 10 ist in "Sekunden", danke. – alecxe

0

Gemäß der WebSite die WebElement von der linktext PC MasterCard innerhalb eines <a> Tag, so werden wir eine einzigartige xpath wie folgt konstruieren:

from selenium import webdriver 

driver = webdriver.Chrome() 
driver.get('https://www.pcfinancial.ca/'); 
driver.find_element_by_xpath('//*[@id="lnkSignInOp"]').click() #click on dropdown menu - working 
driver.find_element_by_xpath("//a[@href='#PCM' and @rel='/re_register/index.html']").click() #click on "PC MasterCard" - now working 
print("Clicked on PC MasterCard") 
+0

Danke für die Antwort, aber das ist tatsächlich eines der Dinge, die ich ausprobiert habe. Leider habe ich den gleichen Fehler. Ich habe die Antwort von der vorherigen Person bekommen. –

Verwandte Themen