我正在使用Selenium和Python来测试一个Web应用程序;但是,Firefox会周期性地进入"无响应"状态。2当Firefox处于这种状态时,脚本将挂起,直到我关闭它。
我试过:
br = webdriver.Firefox()
br.set_page_load_timeout(10)
以及
br = webdriver.Firefox()
br.implicitly_wait(10)
我担心wait
或timeout
方法无法解决我的问题,因为页面是Ajax。.click()
或.submit()
方法发送POST
来回答问题,响应是一个字典,它通过JavaScript用一个新问题更新页面。(这是我使用Google Chrome开发者工具Ctrl + Shift + I中的网络选项卡所理解的)
问题是:
- 如何在Selenium中捕获Firefox无响应的情况?**
我希望捕捉这种情况,这样我就可以关闭浏览器,并开始一个新的。
在 * ExperimentsWithCode * 回答后编辑:
下面是我的一段代码来说明我的问题。
def answer_questions(self):
q = QuestionParser(self.br.page_source)
q.add_to_db()
qid = q.get_qid()
# My answer
my_answer_id = q.get_my_answer()
self.br.find_element_by_id(my_answer_id).click()
# Submit answer
self.br.find_element_by_xpath('//*[contains(@id, "submit_btn_")]').click()
try:
find_id = "submit_btn_" + str(qid)
element = WebDriverWait(self.br,10).until(EC.presence_of_element_located((By.ID, find_id)))
except:
print 'I caught you'
self.rnd(mu=7, s=2) # a method to sleep for a random time
我在一个循环中调用了answer_questions()
方法。这段代码运行良好,直到Firefox崩溃,然后它会挂起,直到我关闭它。我read the docs,担心我已经用尽了一切。问题不是加载页面或元素。问题是我不知道如何检测Firefox崩溃。WebDriverWait
看起来很有前途,但它没有抛出TimeoutException
时,Firefox崩溃。
谢谢你抽出时间。
- 我想出了一个解决问题的方法。**以下是我所做的一小段:
import os, socket
from threading import Timer
def force_timeout(self):
os.system('taskkill /im firefox.exe /f /t')
# for Windows
# /im firefox.exe is to select firefox
# /f is to forcefully kill
# /t is to kill all child processes
for i in range(0, 1000):
try:
t = Timer(60, self.force_timeout)
# run force_timeout from new thread after 60 seconds
t.start() # start timer
self.answer_questions()
# if self.answer_questions() finishes before 60s, cancel timer
t.cancel() # cancel timer
except socket.error:
self.new_browser() # create a new browser
self.login() # login
self.go_to_questions() # Go to questions page so the loop can continue
# Code to recover from crash here
如果answer_questions()
方法没有在60秒内完成,force_timeout()
将从一个新线程运行,并强制杀死firefox.exe
。一旦Firefox被终止,代码将抛出一个socket.error
错误。捕捉这个错误,然后做你需要做的事情来恢复浏览器崩溃。我发现代码有点脏,但它的工作完全符合我的需要。
供日后参考:操作系统-Win8, selenium 版本-2.40.0,火狐版本-27.0.1
Windows Taskkill
Python线程处理.计时器
3条答案
按热度按时间lskq00tm1#
Webdriver文档中有一节是关于here的。
从文档中,您可以尝试显式等待:
如果在10秒内找不到元素,则此操作将超时,否则将在该窗口中返回元素。
w3nuxt5m2#
对于那些在 *nix上的人,
可以很好地杀死当前进程的Firefox子进程。
pkill man page
2wnc66cl3#
我不知道如何解释Selenium经常不可预测的无响应性,但我可以说退出或关闭驱动程序(
driver.quit()
或driver.close()
)没有帮助,因为控制浏览器的对象和进程仍然存在。我建议删除对象(
del driver
)并重新创建新的驱动程序。