Python Selenium 2.39和Firefox 26

11

我正尝试执行一些带有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自动生成的默认unittest函数

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())

1
我几天前也遇到了同样的问题。解决方法:降级到Selenium 2.37.0版本。 - jonozzz
1
我尝试使用我的Selenium IDE生成的脚本(Python 2.7,Selenium 2.39,Firefox 26)复制您的问题,但我没有遇到错误。您能否发布整个脚本?(如果它很大,您可以使用http://pastebin.com/) - Adam F
1
简而言之,在短时间测试中,错误未出现,但在长时间测试(> 4分钟)中,Firefox崩溃:我进行了不同的测试并测量了时间,它不会在特定代码段中断,而是在特定时间范围内发生,该范围介于3到4分钟之间。 - Ben Ishak
嗯,奇怪,我的针对django-dash(https://github.com/barseghyanartur/django-dash/blob/master/src/dash/tests.py)的Selenium测试运行良好,我可以填写表单、提交它们、访问链接,也能考虑JavaScript。我使用Python的`selenium`库(https://pypi.python.org/pypi/selenium/2.37.0)。Firefox版本为26(Ubuntu 12.04 LTS)。 - Artur Barseghyan
昨天我遇到了OP报告的同样问题。升级到Selenium 2.40和Firefox 28后,我能够运行完整的测试套件而没有任何问题。 - MinimalMaximizer
显示剩余4条评论
5个回答

1
我用以下方法解决了问题:
这里获取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 版本。

享受吧!


1

0

没有帮助,我正在使用Web2py而不是Django。 - Ben Ishak

0
我在使用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__

我随后下载了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']

到目前为止,错误尚未再次出现。


0

不确定您尝试的是哪个 Selenium 2.38 的子版本,但这个问题似乎在2.38.4中已经修复。这里是问题链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接