【问题标题】:Python Selenium how to wait before clicking on linkPython Selenium 如何在点击链接之前等待
【发布时间】:2014-12-22 10:33:12
【问题描述】:

我只是想知道,如何让浏览器在点击链接之前等待?我的目标是我从动态网页中抓取,内容是动态的,但我设法获取表单 ID。唯一的问题是提交按钮仅在 2-3 秒后显示。但是,我的 Firefox 驱动程序在页面加载后立即开始点击链接(不是动态部分)。

有什么方法可以让我的浏览器等待 2-3 秒直到提交按钮出现?我尝试使用time.sleep(),但它会暂停所有内容,提交按钮在time.sleep 期间不会出现,但在time.sleep 结束时会在2-3 秒后出现。

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    您需要使用Selenium Waits

    特别是,element_to_be_clickable 预期条件比其他条件更适合:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "myDynamicElement"))
    )
    element.click()
    

    driver 是您的 webdriver 实例,10 是等待元素的秒数。使用此设置,selenium 将尝试每 500 毫秒定位一个元素,总共 10 秒。如果找不到元素,它将在 10 秒后抛出 TimeoutException

    【讨论】:

    • 我今天学到了一些新东西,那就是 element_to_be_clickable ,谢谢
    • 谢谢也解决了我的目的,在我的情况下,首先按钮被禁用并且基于某些事件变得可点击。
    【解决方案2】:

    你可以像下面这样设置等待:

    显式等待

        element = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.ID, "myElement"))
    

    隐式等待:

     driver.implicitly_wait(20) # seconds
     driver.get("Your-URL")
     myElement = driver.find_element_by_id("myElement")
    

    您可以使用以上任何一种。两者都有效。

    【讨论】:

    • 完美,这就是我所需要的,谢谢。澄清一下,显式等待仅适用于该元素,而隐式等待将适用于整个会话,对吗?
    • 是的,你是对的,如果你想要主差异。那么请参考:stackoverflow.com/questions/22656615/…
    • @HelpingHands :您使用的上述两种等待实际上都是Explicitwaits,而不是Implicit waits。请相应地检查并编辑您的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2020-06-29
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多