2016-04-06 1 views
1

Ich möchte auf einen Kalendereintrag in diesem site mit Selen in Python klicken. Obwohl ich jeden Kalendereintrag klar sehen kann und ich kann seinen xpath, ID usw. bekommen. Aber wenn ich versuche, das Element zu lokalisieren, erhalte ich einen Fehler. (Zum Beispiel kann ich sehen, dass der Link für den 20. Tag des Monats April hat eine ID = ‚20160420‘)Kann ein sichtbares Element mit Python Selen nicht finden

browser = webdriver.Firefox(firefox_profile=fp) 
browser.get(url) 
browser.implicitly_wait(5) 
el=browser.find_element_by_id('20160420') 

Irgendwelche Vorschläge (habe ich versucht, zwischen den Bildern wechseln, aktive Elemente usw., aber ohne Erfolg, so weit ...)

+0

Sind Sie sicher, dass Sie den iframe korrekt eingestellt haben? – Zhack

+0

Ich bin mir nicht ganz sicher. Ich sah zwei Frames im Code und versuchte, zu beiden zu wechseln. Gibt es eine Möglichkeit, alle Frames aufzulisten? – gpanterov

Antwort

2

Das Problem ist, dass Ihr Code noch nicht auf iframe umgeschaltet hat. Siehe Beispiel-Code unten:

browser = webdriver.Firefox(firefox_profile=fp) 
browser.get(url) 
browser.implicitly_wait(5) 
time.sleep(5) 
iframe = browser.find_element_by_css_selector('#crowdTorchTicketingMainContainer > iframe') 
browser.switch_to.frame(iframe) 
el=browser.find_element_by_id('20160420') 
print(el.text) 
+0

Das hat es geschafft! Vielen Dank! Schnelle Nachverfolgung - wie haben Sie den CSS-Selektor für den richtigen Frame gefunden? Ich habe versucht, in der Rohseitenquelle nach diesem Frame zu suchen, aber es wurde nichts angezeigt – gpanterov

+0

Sie können Chrome Dev'Tool verwenden, um die Hierarchie der Elemente anzuzeigen. Siehe meine Antwort in diesem Post: http://stackoverflow.com/questions/35194819/unable-to-access-login-container-elements-in-chrome/35196463?noredirect=1#comment58112245_35196463. In Bezug auf den Css Selector Ausdruck habe ich es selbst erstellt. Sie können einige interessante Beispiele von https://saucelabs.com/resources/selenium/css-selectors sehen. – Buaban

0

Das Problem scheint zu sein, dass das Element, das Sie suchen in einem Iframe ist, und Sie müssen, dass wechseln, bevor Sie das Kalenderelement zugreifen können:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait as WDW 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import NoSuchElementException,  TimeoutException, StaleElementReferenceException 


url = 'https://hornblowernewyork.com/cruises/international-sightseeing-cruise' 
browser = webdriver.Firefox() 
browser.get(url) 

# seach for the appropriate iframe 
frame = browser.find_element(By.CSS_SELECTOR, "#crowdTorchTicketingMainContainer > iframe") 
if not frame: 
    raise Exception('Frame not found') 

# once the correct iframe is found switch to it, 
# then look for your calendar element 
browser.switch_to.frame(frame) 
try: 
    el = WDW(browser, 10).until(
    EC.presence_of_element_located((By.ID, "20160406")) 
) 
except (TimeoutException, NoSuchElementException, StaleElementReferenceException), e: 
    print e 
else: 
    print el 
+0

Ich denke, es wäre besser, wenn wir CSS-Selektor verwenden, um den Iframe direkt zu erhalten. Zum Beispiel, Frame = find_element_by_css_selector ("iframe [src * = 'ticketmob']") – Buaban

+0

basierend auf Ihren Kommentaren @Buaban, änderte ich meine Antwort für die Suche nach nur einem iframe von css-Selektor, anstatt durch eine Gruppenfilterung nach Attributen zu sortieren innerhalb der iframes. – KrusherKailash