我在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加载策略,因为我将永远需要完全加载的页面,所以我希望在找到所需的元素后直接查看代码,而不需要整个页面完成加载。
答案 0 :(得分:0)
经过一些测试后,我找到了问题的根源。并不是说等待不起作用。问题是定位器一直在占用所有的时间。我通过编写自己的等待函数并使用.find_element_by_css_selector()
方法来发现这一点,这是在需要100多秒时所有运行时发生的地方。由于我的定位器的性质和页面源的复杂性,当页面几乎完全加载时,定位器有时需要100多秒才能找到元素。定位器时间不计入等待时间。我认为对此唯一的“解决方案”是编写一个更有效的定位器。