Python Selenium 2.39 и Firefox 26

я пытаюсь выполнить какой-то селен с помощью скриптов 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)

РЕДАКТИРОВАТЬ:

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

person Ben Ishak    schedule 08.12.2013    source источник
comment
Вы пробовали self.driver.close() вместо .quit()? Я не уверен в разнице между этими двумя методами - попробуйте :)   -  person Isaac    schedule 09.12.2013
comment
Я начал видеть то же самое несколько дней назад. Решение: перейти на селен 2.37.0   -  person jonozzz    schedule 10.12.2013
comment
Я тестировал ту же программу с селеном 2.35 и Firefox 23, она работает нормально, но после обновления firefox я тоже начал видеть проблемы (не такие, как здесь), поэтому я обновил селен до 2.38 и начал видеть ту же проблему в середине test firefox зависает и больше не отвечает, а потом вылетает   -  person Ben Ishak    schedule 17.12.2013
comment
Я попытался воспроизвести вашу проблему (Python 2.7, Selenium 2.39, Firefox 26) с помощью моего собственного скрипта, сгенерированного Selenium IDE, но я не получаю ошибку. Можете ли вы опубликовать весь сценарий? (Если он большой, вы можете использовать pastebin.com)   -  person Adam F    schedule 21.12.2013
comment
в коротких тестах ошибка не появляется, но в длинных тестах (> 4 минуты) firefox падает: я сделал разные тесты и замерил время, он не ломается на определенном фрагменте кода, а в определенное время, которое колеблется от 3 до 4 минут   -  person Ben Ishak    schedule 25.12.2013
comment
Selenium 2.37.0 нормально работает с Firefox 26, а 2.39.0 — нет.   -  person Artur Barseghyan    schedule 18.01.2014
comment
к сожалению, у меня это тоже не работает, короткие/простые тесты отлично работают с 2.37 и 2.39, но мои тесты длинные и сложные, тесты должны заполнять много форм, отправлять их, посещать много ссылок, выполнять много javascripts. эти тесты работали на 100% со старой версией Firefox (последний раз тестировался на Firefox 23) ах да, и, кстати, они также работают на Chromedriver, но мне не нравится Chromedriver, потому что это не официально!   -  person Ben Ishak    schedule 18.01.2014
comment
Хм, странно, мои тесты селена для django-dash (github. com/barseghyanartur/django-dash/blob/master/src/dash/) работает нормально, и я заполняю формы, отправляю их, посещаю ссылки, и JavaScript также принимается во внимание. Я использую Python selenium (pypi.python.org/pypi/selenium/2.37.0). Firefox версии 26 (Ubuntu 12.04 LTS).   -  person Artur Barseghyan    schedule 20.01.2014
comment
Вчера я видел ту же проблему, о которой сообщил OP. Обновился до Selenium 2.40 и Firefox 28, и я могу без проблем запускать полный пакет.   -  person MinimalMaximizer    schedule 25.03.2014


Ответы (5)


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

Загрузите переносную версию 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

Наслаждаться!

person Ben Ishak    schedule 26.01.2014

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

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

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

person Justin    schedule 17.12.2014

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

person nilesh    schedule 23.12.2013

Вы можете попробовать этот код:

from os import environ

И внутри вашего тестового класса:

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

Вероятно, у меня была похожая проблема: Django Jenkins вызывает WebDriverException при обработке на сервере Selenium

person Vladimir Chub    schedule 26.12.2013
comment
не помогло, я использую web2py и не Django - person Ben Ishak; 26.12.2013

Я также получал ошибки 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']

И пока ошибка не всплывала.

person duhaime    schedule 27.01.2014