selenium 如何解决没有等待足够长时间的显式等待

vjhs03f7  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(125)

我正在尝试编写一系列事件,这些事件依赖于 selenium 中的最后一个事件。首先单击加载新页面的登录,然后单击该页面上的滚动框,然后单击滚动框内的按钮,该按钮在滚动框被单击之前不会被加载。
我正在努力停止使用时间。睡眠(X),因为我读到了这是一种糟糕的做法,我正在努力学习更多关于 selenium 的工作原理。
我得到的不起作用的代码是

from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as ec

    login_box = WebDriverWait(driver, 5).until(
        ec.element_to_be_clickable((By.XPATH, "//*[@id=\"loginAppRoot\"]/div[1]/div[1]/button/span")))
    login_box.click()
    print("login")
    scroll_box = WebDriverWait(driver, 5).until(
        ec.element_to_be_clickable((By.XPATH, "//*[@id=\"searchBarFilterDropdown\"]")))
    scroll_box.click()
    box_inside_scroll = WebDriverWait(driver, 5).until(
        ec.element_to_be_clickable((By.XPATH, "//*[@id=\"global-header\"]/nav[1]/div[2]/div/div[1]/ul/li[44]/a")))
    box_inside_scroll.click()

我能让它工作的唯一方法是把time.sleep(2)放在scroll_box.click()之前。根据我的理解,网络驱动程序的等待和预期条件应该会使我不需要使用时间。睡眠。有人能帮我删除预定义的等待时间吗?

htrmnn0y

htrmnn0y1#

如果你需要更长的时间等待,你只需要改变超时时间。如果你只需要再多2秒钟,那就试试吧

scroll_box = WebDriverWait(driver, 7).until(
        ec.element_to_be_clickable((By.XPATH, "//*[@id=\"searchBarFilterDropdown\"]")))
    scroll_box.click()

在使用WebDriverWait时,在括号中,您的第一个输入是您的驱动程序,第二个输入是您希望Selify在超时之前等待的时间。您可以尝试10,而不是7,因此在尝试单击滚动框之前,它会等待10秒。

vlurs2pr

vlurs2pr2#

更改超时对我没有任何影响,所以这是另一个答案。
不是一个好的行为,但它节省了你的时间:
我想点击元素“断路器控制”,我需要页面被加载,所以我这样做

page_loaded = False
    while not page_loaded :
      try:
        WebDriverWait(self.driver, 40).until(EC.element_to_be_clickable((By.LINK_TEXT, "Circuit Breaker control"))).click()
        page_loaded = True
      except:
        time.sleep(1)

当它没有等待足够的时间时,我得到的错误是:

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <a data-toggle="tab" onclick="getSelectedTab('tab_cblbs_position')" href="#tab_cblbs_position">...</a> is not clickable at point (188, 254). Other element would receive the click: <div class="waitMe" data-waitme_id="100" style="background: rgba(255, 255, 255, 0.7);">...</div>

我希望它能帮上忙。

相关问题