gpt4 book ai didi

python - 在将 Selenium WebDriver 与 Python 结合使用时处理 Firefox 不响应?

转载 作者:太空狗 更新时间:2023-10-29 17:20:57 24 4
gpt4 key购买 nike

我正在使用 Selenium 和 Python 来测试网络应用程序;但是,Firefox 会定期进入“无响应”状态。当 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 Not Responding 的情况?

我希望捕捉到这种情况,这样我就可以关闭浏览器并启动一个新浏览器。


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 看起来很有前途,但当 Firefox 崩溃时它没有抛出 TimeoutException .

感谢您的宝贵时间。


我为我的问题设计了一个补救措施。这是我所做的一个片段:

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,Firefox 版本 - 27.0.1

Windows Taskkill
Python threading.Timer

最佳答案

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 秒内找不到该元素,这将超时,或者在该窗口内返回该元素。

关于python - 在将 Selenium WebDriver 与 Python 结合使用时处理 Firefox 不响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22341485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com