Selenium Webdriver:(python)等待元素不存在(不工作)

Selenium Webdriver: (python) wait for element to not be present (not working)

我正在学习 Selenium 网络驱动程序并已开始使用 python 来测试网站。我在等待元素不存在代码时遇到问题,因为它似乎超时了。

这是我目前的代码。

def test_(self):
        driver = self.driver
        driver.get(self.base_url + "/abc")
        driver.find_element_by_id("UserName").clear()
        driver.find_element_by_id("UserName").send_keys("username")
        driver.find_element_by_id("Password").clear()
        driver.find_element_by_id("Password").send_keys("password")
        driver.find_element_by_id("loginbutton").click()
        for i in range(60):
            try:
                if not self.is_element_present(By.CSS_SELECTOR, ".blockUI"): break
            except: pass
            time.sleep(1)
        else: self.fail("time out")
        driver.find_element_by_xpath(".//*[@id='ChangeTaskGridM']/table/thead/tr/th[1]/a").click()
        for i in range(60):
            try:
                if not self.is_element_present(By.CSS_SELECTOR, ".blockUI"): break
            except: pass
            time.sleep(1)
        else: self.fail("time out")
        driver.find_element_by_xpath(".//*[@id='ChangeTaskGridM']/table/thead/tr/th[2]/a").click()
        for i in range(60):
            try:
                if not self.is_element_present(By.CSS_SELECTOR, ".blockUI"): break
            except: pass
            time.sleep(1)
        else: self.fail("time out")

我不确定为什么会超时。如果我删除 blockUI,它会 运行 很快,我也不想在两者之间放置手动中断。有什么想法吗?

当前要检测的代码is_element_present

for i in range(60):
            try:
                if not self.is_element_present(By.CSS_SELECTOR, ".blockUI"): break
            except: pass
            time.sleep(1)
        else: self.fail("time out")

您应该使用 ExpectedConditions 而不是检查该元素是否存在的代码。请阅读doc for waits。 presence_of_element_located() 可能是您感兴趣的那个。

你把 sleep 放错地方了,我相信这就是你想要的:

for i in range(60):
            try:
                if not self.is_element_present(By.CSS_SELECTOR, ".blockUI"): 
                    break
                else:
                    time.sleep(1)
            except: pass

also in Python else after for 总是在循环成功结束后执行,难怪你每次都得到self.fail("time out")