与更改HTML值的页面元素交互

时间:2017-04-17 02:16:44

标签: python selenium selenium-webdriver

我在http://seattle.bestparking.com/上使用Selenium来点击停车场标记(红色,灰色,蓝色),打算打开弹出信息窗口,这样我就可以废弃信息了弹出窗口中的“费率”页面)。最后看到我的代码。

但是,在您点击任何其他相同颜色的车库标记后,每个车库标记的内部HTML都会发生变化(!!),然后关闭它(由于内容重新加载)。

例如:在运行我的代码时,“Motif Seattle”车库显示为div id = daily_colored_marker_577。但是,在点击任何其他相同颜色的标记后,“Motif Seattle”显示为div id = daily_colored_marker_1042 ...并继续更改。

这使得我似乎无法遍历我选择的所有标记(find_elements_by_class的结果),因为它会在到达所选列表中的第二个元素时抛出以下类型或错误:

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"...

我的代码:

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)

1 个答案:

答案 0 :(得分:0)

我不认为错误意味着你认为它意味着什么。如果你看一下,就会说明另一个元素会收到点击。 Selenium点击元素的中心。如果你看一下地图,就会有一些相互覆盖的针脚。它可能正在尝试单击下一个元素,并且它被一个不同的元素部分覆盖,因此它会抛出错误。

由于我假设您没有尝试执行某些用户场景,因此您可以使用JavascriptExecutor执行单击并单击精确元素。

您可以在this question中看到如何执行此操作的示例。