2017-03-28 9 views
0

Ich bin neu bei der Verwendung von Selenium und versuche herauszufinden, wie man die Wartezeit bis Methode auf der Website booking.com verwenden, um zu warten, bis die Dropdown-Optionen wie im Bild sichtbar sind. enter image description hereSelen warten bis Methode

Dies ist der Code, den ich mit Arbeit bin:

driver.get('http://booking.com') 
driver.find_element_by_css_selector('#ss').send_keys("London") 
WebDriverWait(driver,1).until('PLEASE SUGGEST WHAT TO INPUT') 
driver.find_element(By.XPATH, """//*[@id="frm"]/div[2]/div/div[1]/ul[1]/li[1]""").click() 

Mit dem Chrom-Inspektoren, ich sehe keine klare Selektor oder Element nicht für die bis Methode in den Klammern zu verwenden. Wenn ich auf den sichtbaren Optionen der rechten Maustaste und klicken Sie auf ‚Copy Wähler‘ diese bekomme ich nur:

#frm > div:nth-child(8) > div > div.c-autocomplete.sb-destination > ul.c-autocomplete__list.sb-autocomplete__list.-visible > li.c-autocomplete__item.sb-autocomplete__item.sb-autocomplete__item--city 

Bitte kann mir jemand vorschlagen, was ich hier tun müssen.

Antwort

1

Sie können versuchen, zu warten, bis eine der Drop-down-Optionen anklickbar mit ExpectedConditions:

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

driver.find_element_by_css_selector('#ss').send_keys("London") 
WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH, '//li[@class="c-autocomplete__item sb-autocomplete__item sb-autocomplete__item--city sb-autocomplete__item--two-lines "]'))) 

Beachten Sie, dass zweites Argument Sie in WebDriverWait() passieren ist Timeout (in Sekunden) und 1 Sekunden möglicherweise nicht genug sein, um warten Erwartung erfüllte

gewünschte Option wählen Sie ausführlichere relativ XPath statt absolut man verwenden könnten:

driver.find_element(By.XPATH, '//li//b[text()="Central London"]').click() 

Dies sollte Option mit fettem Text "Central London" auswählen. Ersetzen Sie einfach "Central London" mit entsprechenden Wert eine andere Option

+0

zu erhöhen Welchen Wert würde ich stattdessen eine relative XPath haben setzen von einem absoluten, wenn ich den Code schreiben wollte, so dass er auf die erste Option für irgendeine Stadt klicken würde, die eingegeben wurde? – Paulos

+1

''// li [@ klasse =" c-autocomplete__item sb-autocomplete__item sb-autocomplete__item - city sb-autocomplete__item - zweizeilig "]'' ist 'XPath', um die erste Option zu treffen – Andersson

2

Versuchen Sie diesen Code wählen:

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


driver = webdriver.Chrome() 
driver.maximize_window() 


driver.get('http://booking.com') 
driver.find_element_by_css_selector('#ss').send_keys("London") 
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".search_hl_name"))) 
driver.find_elements(By.XPATH, "//*[@class ='search_hl_name']")[1].click() // you can use relative xpath in place of absolute one, replace index value at [1] with 0-4 which ever you want to select 

Wie zu Recht von Andersson erwähnt benötigen Sie den Timeout

+0

Das ist super danke. Wie finden Sie den CSS-SELECTOR oder XPATH mit den Inspector/Web-Dev-Tools in Chrome (oder Firefox)? Und woher weißt du, ob es eine absolute oder relative XPATH ist? – Paulos

+2

Wenn Sie xpath mit // beginnen und nur kleine Werte setzen, um das Element zu finden, dann seinen relativen xpath und in absoluten xpath beginnen Sie mit/als/x/x/x/so etwas, das den HTML-Code durchläuft. Unter diesem Link finden Sie einige Informationen. http://www.guru99.com/xpath-selenium.html – thebadguy

+0

Danke, tolle Post übrigens, ich habe es jetzt vorgemerkt. – Paulos