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

时间:2016-03-01 14:23:37

标签: python html selenium testing element

我正在学习Selenium Web驱动程序,并已开始使用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")

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你把睡眠放在错误的地方,我相信这就是你想要的:

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

也是在Python之后,for after将在循环成功结束后执行,难怪你每次都得到self.fail(“超时”)