显式等待不会在Selenium Python中持续超时

时间:2017-02-25 12:01:20

标签: python selenium selenium-webdriver wait

我在Python 3中使用Selenium有以下代码:

profile = webdriver.FirefoxProfile()
profile.set_preference('webdriver.load.strategy', 'unstable')
browser = webdriver.Firefox(profile)
browser.set_page_load_timeout(10)
url = 'my_url'
while True:
    try:  
        st = time.time()
        browser.get(url)
        print('Finished get!')
        time.sleep(2)
        wait = WebDriverWait(browser, 10)
        element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div[my_attr="my_attr"]')))  
        print('Success after {} seconds.'.format(round(time.time()-st)))  
        break
    except:
        print('Timed out after {} seconds.'.format(round(time.time()-st)))
        print('Reloading')
        continue

根据我的理解,在这里使用显式等待(即使使用不稳定的加载策略和页面加载超时),应该发生的是页面应该加载,它应该查找指定的元素,如果页面没有'在10秒内加载或者在10秒内找不到元素,它应该超时并重新加载(因为带有while循环的try / except子句)。

但是,我发现它并不是一直都是超时的。例如,我有一些实例,第一次加载时间超过10秒,但是一旦重新加载,它就不会超时,而是在140秒之后“成功”。或者有时它根本没有超时,只是一直运行直到成功。由于不稳定的加载策略,我认为页面加载本身不会超时(更具体地说,'Finished get!'消息总是打印出来)。但是我指定的明确等待似乎也不一致。我的代码中有什么东西可以覆盖超时吗?我希望超时是一致的,如果页面没有加载或元素不在10秒内,我希望它超时并重新加载。即使成功,我也不希望它持续100秒以上。

请注意,我在这里使用的是不稳定的webdriver加载策略,因为我将永远需要完全加载的页面,所以我希望在找到所需的元素后直接查看代码,而不需要整个页面完成加载。

1 个答案:

答案 0 :(得分:0)

经过一些测试后,我找到了问题的根源。并不是说等待不起作用。问题是定位器一直在占用所有的时间。我通过编写自己的等待函数并使用.find_element_by_css_selector()方法来发现这一点,这是在需要100多秒时所有运行时发生的地方。由于我的定位器的性质和页面源的复杂性,当页面几乎完全加载时,定位器有时需要100多秒才能找到元素。定位器时间不计入等待时间。我认为对此唯一的“解决方案”是编写一个更有效的定位器。