0

浏览通过 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()

我希望我的服务员功能能够成功确保该元素是可点击的,而不会造成睡眠功能的潜在时间浪费/不可靠性。唉,没有这样的现实。

4

1 回答 1

0

看起来在您的服务员函数中,您首先查找元素,然后等待。

element_present = EC.presence_of_element_located((by, selector))
WebDriverWait(driver, timeout).until(element_present)

尝试交换位置并首先等待元素。

于 2019-05-16T05:58:39.770 回答