如何处理Firefox在使用Selenium WebDriver和Python时没有响应?

n8ghc7c1  于 2023-01-01  发布在  Python
关注(0)|答案(3)|浏览(147)

我正在使用Selenium和Python来测试一个Web应用程序;但是,Firefox会周期性地进入"无响应"状态。2当Firefox处于这种状态时,脚本将挂起,直到我关闭它。
我试过:

br = webdriver.Firefox()
br.set_page_load_timeout(10)

以及

br = webdriver.Firefox()
br.implicitly_wait(10)

我担心waittimeout方法无法解决我的问题,因为页面是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线程处理.计时器

lskq00tm

lskq00tm1#

Webdriver文档中有一节是关于here的。
从文档中,您可以尝试显式等待:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0

br = webdriver.Firefox()
br.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(br, 10).until(EC.presence_of_element_located((By.ID, "_element_You_Are_Need_To_Load")))
finally:
    br.quit()

如果在10秒内找不到元素,则此操作将超时,否则将在该窗口中返回元素。

w3nuxt5m

w3nuxt5m2#

对于那些在 *nix上的人,

os.system("pkill -P %d firefox" % os.getpid())

可以很好地杀死当前进程的Firefox子进程。
pkill man page

2wnc66cl

2wnc66cl3#

我不知道如何解释Selenium经常不可预测的无响应性,但我可以说退出或关闭驱动程序(driver.quit()driver.close())没有帮助,因为控制浏览器的对象和进程仍然存在。
我建议删除对象(del driver)并重新创建新的驱动程序。

相关问题