【问题标题】:Selenium wait until element by ID is present or visibleSelenium 等到 ID 的元素存在或可见
【发布时间】:2021-02-01 07:36:32
【问题描述】:

我如何让 Selenium 等到页面上出现某个 ID 元素?

driver.find_element(By.ID, "FirstName").send_keys("MyFirstName")
driver.find_element(By.ID, "LastName").send_keys("MyLastName")
driver.find_element(By.ID, "PhoneNumber").send_keys("myPhoneNumber")
driver.find_element(By.ID, "Email").send_keys("myEmail")

例如第 3 行,可能不在页面上,我希望它等到元素出现,然后执行特定任务并继续执行下一行代码。

【问题讨论】:

    标签: python selenium-webdriver xpath css-selectors webdriverwait


    【解决方案1】:

    你可以用这个。

    Java:

    WebDriverWait w1 = new WebDriverWait(driver, 5);
    w1.until(ExpectedConditions.visibilityOfElementLocated(By.id("submit_btn")));
    

    Python:

    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
    
    driver = webdriver.Firefox()
    driver.get("http://somedomain/url_that_delays_loading")
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "myDynamicElement"))
        )
    finally:
        driver.quit()
    

    查看更多信息:https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html

    【讨论】:

    • 代码结束,如果我不想拥有driver.quit()怎么办?应该改变什么?因为我想在元素出现后继续下一行代码
    • 你可以只添加日志,例如print("ID 为 123 的 Web 元素不存在") 和 sam 逻辑变量 isPresent= false;在您可以添加任何您想要的代码之后,这些代码不会进入 finally 块。请注意,您无法与不存在的元素进行交互。
    • 在继续下一个块之前等待元素出现多长时间?
    • 取决于每个特定情况。通常你不需要超过 5 秒,但正如我所说的那样。例如,您可以上传一个大文件,上传后您会收到“文件已上传”的消息,在这种情况下您可以等待几分钟。 :-)
    • 我的意思是你指定的代码尝试: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) 等待元素多久在场?10 秒?
    【解决方案2】:

    要等到元素出现发送字符序列,您需要为element_to_be_clickable() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

    • 使用ID

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "PhoneNumber"))).send_keys("user901")
      
    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#myPhoneNumber"))).send_keys("user901")
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='myPhoneNumber']"))).send_keys("user901")
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 2014-05-03
      • 2019-11-02
      • 2020-11-22
      • 2016-07-18
      • 1970-01-01
      • 2017-08-14
      • 2019-10-21
      • 2020-03-26
      相关资源
      最近更新 更多