一般显式等待 - 硒python

时间:2018-02-05 13:52:26

标签: python selenium explicit

我希望这个问题是独一无二的,也有助于其他测试人员 我需要python selenium的解决方案 我需要通过时间显式等待来替换几行time.sleep()行代码。 当Chrome在每个预期被点击的元素之前休眠几秒钟时,测试会成功运行,但不会失败。

所以它是这样的:

driver.find_element_by_xpath("x").click()  
time.sleep(5)
driver.find_element_by_xpath("y").click()  
time.sleep(5)
driver.find_element_by_xpath("z").click()  
time.sleep(5)

...

肯定是隐晦等待是不够的。

以下是推荐的代码:

from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))

我看一下这个示例代码,但似乎我必须多次引用每个ID。

所以问题是:
是否有任何全局解决方案使用显式等待脚本中的每个元素,而不需要乘以代码行?

1 个答案:

答案 0 :(得分:1)

我不知道这是否是你需要的。但是如果你愿意,你可以使用一个试图点击的功能,直到成功或达到超时。这样,你只需要调用它并等待。

manager.create_api(Roles, results_per_page=0, methods=['GET'])

如果您应用它,您的代码将是:

import timeit
from selenium import webdriver

def safe_click(wd_elem, max_time=10):
    """
    wd_elem should be a WebElement object, so it has the .click() method
    max_time defaults to 10 [seconds], and it's how long will the script try to click before it stops
    """

    start = timeit.default_timer()
    while timeit.default_timer() - start <= max_time:
        try:
            wd_elem.click()
            return
        except:
            pass
    print 'Max time reached; stopped trying'

wd = webdriver.Chrome()
wd.get('https://stackoverflow.com/questions/48624119/general-explicit-wait-selenium-python')
elem_to_click = wd.find_element_by_xpath('//*[@id="question-header"]/h1/a')
safe_click(elem_to_click)  # Clicks it
safe_click(None)  # After 10 seconds, it gives up