Python Selenium 2.39 и Firefox 26

im пытается выполнить селен с unittest скриптами, но я получаю следующую ошибку

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 в строке 70 в функции tearDown(), которая является стандартной функцией unittest, автоматически генерируемой с помощью Selenium-IDE

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

EDIT:

Эта проблема возникла, когда я обновил 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

я решил проблему таким образом

Получите портативную версию 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)

это было протестировано с селеном 2.37.2 и 2.39.0

Наслаждайтесь!

Ответ 2

Из того, что я могу сказать, эта ошибка вызвана тем, что браузер выключен/убит/сбой, а селен не может обработать ответ, который возвращается (пустой ответ). Я включил сюда детали:

Как бороться со спорадическими ошибками BadStatusLine, CannotSendRequest в python WebDriver

Но это довольно распространенная ситуация, когда версии firefox и версии selenium несовместимы. Я бы выбрал самые стабильные версии и придерживаюсь этих.

Ответ 3

Не уверен, какая под-версия selenium 2.38 вы пытались, но эта проблема, похоже, исправлена ​​в 2.38.4. Вот ссылка

Ответ 5

Я также получал ошибки CannotSendRequest() при запуске Selenium 2.39.0 с Firefox 26 на Python 2.7.0 (ОС Windows 8). Я решил проблему, понизив до 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']

И до сих пор ошибка не появилась.