浏览通过 JS 呈现的网页 ( https://www.hertz.com/rentacar/location )。放置time.sleep(random.randint(5, 10))
导致成功单击元素,而我的waiter
功能(如下所示)导致Other element would receive the click:
错误。
该脚本在每次选择和单击之前成功地使用了美国每个州的每个城市的每个赫兹位置,time.sleep
但我认为这是一种不好的做法,并且由于睡眠需要花费数小时才能完成。
完整的错误文本:
selenium.common.exceptions.WebDriverException: Message: unknown error:
Element <a href="javascript: void(0);" id="CO" name="states">...</a> is not clickable at point (518, 9). Other element would receive the click: <li>...</li>
(Session info: chrome=74.0.3729.157)
(Driver info: chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform=Windows NT 6.1.7601 SP1 x86_64)
元素 HTML(这发生在其他类似元素上)
<li>
<a href="javascript: void(0);" id="CO" name="states">
<span class="icons-ft_arrow_right"></span>
Colorado
</a>
</li>
在我的waiter
功能中,我已替换presence_of_element_located
为:
visibility_of_element_located
element_to_be_clickable
并收到同样的错误。
我也试过
.send_keys(selenium.webdriver.common.keys.Keys.SPACE)
代替
.click()
无济于事
这是我的waiter
功能
def waiter(driver, id=None, class_name=None, link_text=None, name=None, timeout=8):
if id is not None:
by = By.ID
selector = id
elif class_name is not None:
by = By.CLASS_NAME
selector = class_name
elif name is not None:
by = By.NAME
selector = name
else:
by = By.LINK_TEXT
selector = link_text
try:
element_present = EC.presence_of_element_located((by, selector))
WebDriverWait(driver, timeout).until(element_present)
return driver
except TimeoutException:
time.sleep(300)
driver.delete_all_cookies()
try:
element_present = EC.presence_of_element_located((by, selector))
WebDriverWait(driver, timeout).until(element_present)
return driver
except TimeoutException:
print(f"Timed out waiting for {selector} to load")
raise ValueError('Page is fucked?')
这有效
time.sleep(random.randint(5, 10))
directory_link = driver.find_element_by_class_name('ld-tab')
directory_link.click()
这不
waiter(driver, class_name='ld-tab')
directory_link = driver.find_element_by_class_name('ld-tab')
directory_link.click()
我希望我的服务员功能能够成功确保该元素是可点击的,而不会造成睡眠功能的潜在时间浪费/不可靠性。唉,没有这样的现实。