【问题标题】:How to detect a hidden button?如何检测隐藏按钮?
【发布时间】:2021-06-13 18:01:19
【问题描述】:

我有一个按钮:当我点击它时,它会发送一个 ajax 请求,然后,javascript 代码会在完成后将“隐藏”类添加到此按钮。

如何等待 ajax 请求结束?发送点击命令后,我认为 Selenium 应该检测“隐藏”类何时添加到按钮,但我不知道如何。

你能帮帮我吗?

它不起作用(我有一个超时):

driver.find_element(By.ID, "saveButton").click()
wait = WebDriverWait(driver, 20)
wait.until(driver.find_element_by_xpath("//button[@id='saveButton' and contains(@class, 'hide')]"))

【问题讨论】:

  • 如果可能的话,提供网址,以帮助您
  • 您可以使用代理(browsermob 提供一个通用代理)来跟踪触发的请求。否则你可以等待元素不可见。

标签: python selenium selenium-webdriver webdriverwait


【解决方案1】:

使用预期条件presence_of_element_located()visibility_of_element_located()

 wait = WebDriverWait(driver, 20)
 wait.until(EC.presence_of_element_located((By.XPATH, "//button[@id='saveButton' and contains(@class, 'hide')]")))

wait = WebDriverWait(driver, 20)
wait.until(EC.visibility_of_element_located((By.XPATH, "//button[@id='saveButton' and contains(@class, 'hide')]")))

您需要导入以下库。

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

【讨论】:

  • 您需要否定可见性以检查不可见性。
【解决方案2】:

您可以等待元素不可见:

driver.find_element(By.ID, "saveButton").click()
wait = WebDriverWait(driver, 20)
wait.until(EC.invisibility_of_element_located((By.ID, "saveButton"))) 

但如果您想了解更多关于 AJAX 调用的信息,您应该考虑使用代理:https://stackoverflow.com/a/40628176/1387701

【讨论】:

    【解决方案3】:

    我不知道是否还有其他答案,但是在循环中等待这个怎么样?

    while True:
        time.sleep(0.25)
        try:
            #try to get button
            break
        except:
            continue
    

    或者你可以在 if 条件下检查按钮是否可用。

    while True:
        time.sleep(0.25)
        if button:
            break
    

    我希望你明白我的意思。它也可以有另一种方法...

    【讨论】:

      【解决方案4】:

      你也可以试试这个:

      wait = WebDriverWait(driver, 10)
              wait.until(lambda driver: driver.execute_script("return jQuery.active == 0"))
      

      但是,我会选择等待您要与之交互的下一个元素。 例如,接下来您需要单击带有some_id 的按钮。所以,就等着吧:

      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, 20).until(
      EC.element_to_be_clickable((By.CSS_SELECTOR, "#some_id")))
      element.click()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-24
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        相关资源
        最近更新 更多