2017-04-17 11 views
1

Ich benutze Selenium auf http://seattle.bestparking.com/, um durch die Parkhaus-Marker (rot, grau, blau) zu klicken, mit der Absicht, das Pop-up-Info-Fenster zu öffnen, damit ich dann verschrotten kann die Info (auf der Seite "Rate" im Popup-Fenster). Siehe meinen Code am Ende.Interaktion mit Seitenelementen, die HTML-Werte ändern

Es scheint jedoch, dass jeder innere HTML-Code des Garagen-Markers (!!) nach dem Klicken auf einen anderen Garagenmarker der gleichen Farbe und Schließen (aufgrund des Inhalts-Nachladens) geändert wird.

Zum Beispiel: wenn ich meinen Code ausführe, erscheint die "Motif Seattle" Garage als div id = daily_colored_marker_577. Aber nachdem irgendein anderer Marker der gleichen Farbe angeklickt wurde, erscheint "Motif Seattle" als div id = daily_colored_marker_1042 ... und ändert sich ständig.

Dies macht es scheinbar unmöglich durch alle Markierungen zu durchlaufen, die ich (Ergebnis find_elements_by_class) ausgewählt haben, da sie den folgenden Typ oder Fehler werfen, wenn sie in der ausgewählten Liste der 2. Element erreicht:

WebDriverException: unknown error: Element <div 
class="daily_colored_marker_n_a" id="daily_colored_marker_344" onmouseover="show_hide_balloonWindowMonthly('', 'IMPARK', 'IMPARK M Street 
Garage', '344', 400, 'n_a', offsetPosition('daily_colored_marker_344')... 
</div> is not clickable at point (708, 543). Other element would receive the 
click: <div class="daily_colored_marker_grey"... 

Mein Code:

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 
import time 

driver = webdriver.Chrome() 
driver.get('http://seattle.bestparking.com/') 
driver.maximize_window() 

'''Tells driver to wait until the "I understand" button to be clickable''' 
wait = WebDriverWait(driver, 30) 
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//* 
[@id='calendar_navigation_hint']/button"))) 

'''makes the disclaimer pop-up and the left menu go away, to reveal more of 
the map''' 
driver.find_element_by_xpath("//*@id='calendar_navigation_hint'] 
/button").click() 

time.sleep(2) 

driver.find_element_by_xpath("//* 
[@id='map_left_panel_min_max_btn_div_oa']").click() 

time.sleep(2) 

'''zooms out one level''' 
driver.find_element_by_xpath("//* 
[@id='google_maps_zoom_control_minus_id']").click() 

time.sleep(5) 

'''find all the red markers and click on them''' 
all_red = driver.find_elements_by_css_selector("div.daily_colored_marker_n_a") 

time.sleep(3) 

for x in range(0,len(all_red)): 
    all_red[x].click() 
    time.sleep(2) 
    driver.find_element_by_xpath("//*[@id='marker_window_close_text']").click() 
    time.sleep(3) 

Antwort

0

ich glaube nicht, dass Fehler bedeutet das, was Sie denken, es bedeutet. Wenn Sie es betrachten, heißt es, dass ein anderes Element den Klick erhalten würde. Selen klickt auf die Mitte eines Elements. Wenn Sie sich die Karte ansehen, gibt es einige Pins, die sich gegenseitig überdecken. Es ist möglich, dass versucht wird, auf das nächste Element zu klicken, und es wird teilweise von einem anderen Element abgedeckt, sodass es den Fehler auslöst.

Da ich davon ausgehe, dass Sie nicht versuchen, ein Benutzerszenario auszuführen, können Sie mit JavascriptExecutor den Klick ausführen und auf das genaue Element klicken.

Sie können ein Beispiel dafür in this question sehen.