【问题标题】:Python Selenium 2.39 and Firefox 26Python Selenium 2.39 和 Firefox 26
【发布时间】:2013-12-25 05:51:52
【问题描述】:

我尝试使用 unittest 脚本执行一些 selenium,但我收到以下错误

Starting at: "Sat Dec 07 14:43:17 2013"
E
======================================================================
ERROR: test_template (__main__.ManageTemplates)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "template.py", line 70, in tearDown
    self.driver.quit()
  File "C:\Program Files (x86)\Python27\lib\site-packages\selenium-2.38.1-py2.7.egg\selenium\webdriver\firefox\webdriver.py", line 66, in quit
    RemoteWebDriver.quit(self)
  File "C:\Program Files (x86)\Python27\lib\site-packages\selenium-2.38.1-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 454, in quit
    self.execute(Command.QUIT)
  File "C:\Program Files (x86)\Python27\lib\site-packages\selenium-2.38.1-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 162, in execute
    response = self.command_executor.execute(driver_command, params)
  File "C:\Program Files (x86)\Python27\lib\site-packages\selenium-2.38.1-py2.7.egg\selenium\webdriver\remote\remote_connection.py", line 350, in execute
    return self._request(url, method=command_info[0], data=data)
  File "C:\Program Files (x86)\Python27\lib\site-packages\selenium-2.38.1-py2.7.egg\selenium\webdriver\remote\remote_connection.py", line 381, in _request
    self._conn.request(method, parsed_url.path, data, headers)
  File "C:\Program Files (x86)\Python27\lib\httplib.py", line 973, in request
    self._send_request(method, url, body, headers)
  File "C:\Program Files (x86)\Python27\lib\httplib.py", line 1001, in _send_request
    self.putrequest(method, url, **skips)
  File "C:\Program Files (x86)\Python27\lib\httplib.py", line 871, in putrequest
    raise CannotSendRequest()
CannotSendRequest

----------------------------------------------------------------------
Ran 1 test in 766.686s

FAILED (errors=1)

template.py 中的错误发生在 tearDown() 函数的第 70 行,这是使用 Selenium-IDE 自动生成的默认单元测试函数

def tearDown(self):
    self.driver.quit()
    self.assertEqual([], self.verificationErrors)

编辑:

当我将 Firefox 更新到 26 时发生了这个问题,即使当我更新到 selenium 2.39.0 时问题也没有消失


来源:

import unittest
from os import path
from config import config
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from PyWebBotClass import PyWebBot
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from os import listdir, environ
from os.path import isfile, join
import time

class ManageReceivers(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(10)
        self.base_url = config['baseurl']
        self.verificationErrors = []
        self.accept_next_alert = True

    def setup_bot(self, f):
        self.bot = PyWebBot(self.driver, path.join(config['configs'],f))
        self.bot.set_LogPath(config['LogPath'])
        self.bot.set_ScreenshotPath(config['screenshots'])
        self.bot.set_ConfigBaseURL(config['baseurl'])

    def test_receiver_profile(self):
        self.imported = False
        for f in listdir(config['configs']):
            if isfile(join(config['configs'],f)):
                self.setup_bot(f)
                if not self.imported:
                    self.bot.gotourl('csv2db/import_db_1')
                    self.imported = True
                self.bot.goto('login')
                self.bot.JS__fillform('login')
                self.bot.goto('receiver_profile')
                self.bot.JS__fillform('receiver_profile')
                try:
                    self.bot._driver.execute_script("var e = $('.icon-zoom-in'); e[e.length-1].click()")
                except:
                    print "unable to access selector id = view"
                    pass
                try:
                    self.bot._driver.execute_script("var e = $('.icon-pencil'); e[e.length-1].click()")
                except:
                    print "unable to access selector id = edit"
                    pass

                self.bot.JS__fillform('receiver_profile')
                self.bot.goto('logout')

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert.text
        finally: self.accept_next_alert = True

    @classmethod
    def setUpClass(cls):
        environ['NO_PROXY'] = '127.0.0.1'  # IP-address of Jenkins server

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)


if __name__ == '__main__':
    print('Starting at: "%s"' % time.asctime())
    unittest.main()
    print('Finished at: "%s"' % time.asctime())

【问题讨论】:

  • 您是否尝试过 self.driver.close() 而不是 .quit()?我不确定这两种方法之间的区别 - 试一试:)
  • 几天前我开始看到同样的情况。解决方案:降级到 selenium 2.37.0
  • 我用 selenium 2.35 和 Firefox 23 测试了相同的程序,它工作正常,但是在更新 Firefox 之后我也开始看到问题(与这里不同),所以我将 seleniums 更新到 2.38 并开始看到在测试过程中,同样的问题 firefox 挂起并且不再响应,然后就崩溃了
  • 我试图用我自己的 Selenium IDE 生成的脚本复制您的问题(Python 2.7、Selenium 2.39、Firefox 26),但我没有收到错误消息。你能把整个脚本贴出来吗? (如果很大可以使用pastebin.com
  • 在简短的测试中,错误不会出现,但在长时间的测试(> 4 分钟)中 firefox 崩溃:我做了不同的测试并测量了时间,它不会在特定的代码段而是在特定的时间范围在 3 到 4 分钟之间

标签: python firefox selenium-webdriver web2py python-unittest


【解决方案1】:

我就这样解决了问题

here 获取便携式版本的 Firefox(获取与您一起使用的版本,例如我得到 Firefox 版本 23)并将其解压缩到特定目录

import os 
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary(os.path.join('Pathto','FirefoxPortable','FirefoxPortable.exe'))
driver = webdriver.Firefox(firefox_binary=binary)

已使用 selenium 2.37.22.39.0 进行了测试

享受吧!

【讨论】:

    【解决方案2】:

    据我所知,此错误是由浏览器关闭/杀死/崩溃和 selenium 无法处理返回的响应(空响应)引起的。我在这里包含了详细信息:

    How to deal with sporadic BadStatusLine, CannotSendRequest errors in python WebDriver

    但是,firefox 版本和 selenium 版本不兼容是很常见的情况。我只会选择最稳定的版本并坚持使用。

    【讨论】:

      【解决方案3】:

      不确定您尝试了 selenium 2.38 的哪个子版本,但此问题似乎已在 2.38.4 中得到解决。这是issue link

      【讨论】:

        【解决方案4】:

        你可以试试这个代码:

        from os import environ
        

        在您的测试用例类中:

        @classmethod
        def setUpClass(cls):
            environ['NO_PROXY'] = '127.0.0.1'  # IP-address of Jenkins server
        

        可能我遇到了类似的问题: Django Jenkins raises WebDriverException when processed to Selenium server

        【讨论】:

        • 没有帮助,我使用的是 web2py 而没有 Django
        【解决方案5】:

        在 Python 2.7.0(Windows 8 操作系统)上使用 Firefox 26 运行 Selenium 2.39.0 时,我也收到了 CannotSendRequest() 错误。我通过降级到 Selenium 2.35.0 解决了这个问题:

        pip uninstall selenium
        pip install selenium==2.37.0
        

        运行安装 2.35.0 的这些命令。验证:

        import selenium
        print selenium.__version__
        

        然后我 downloaded Firefox 25.0.1 并告诉 Selenium 使用以下代码行加载该版本:

        from selenium import webdriver
        from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
        
        binary = FirefoxBinary('C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe')
        driver = webdriver.Firefox(firefox_binary=binary)
        

        检查正在加载的 Firefox 版本:

        from selenium import webdriver
        driver = webdriver.Firefox()
        print driver.capabilities['version']
        

        到目前为止,错误还没有出现。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-02
          • 2013-12-28
          • 1970-01-01
          • 1970-01-01
          • 2014-01-20
          • 2011-09-24
          • 2021-06-08
          相关资源
          最近更新 更多