【问题标题】:Selenium test errors out when run locally in development environment (Reached error page: about:neterror?e=connection) but fails in Travis CISelenium 测试在开发环境中本地运行时出错(到达错误页面:about:neterror?e=connection)但在 Travis CI 中失败
【发布时间】:2019-02-25 18:04:25
【问题描述】:

在开发环境中本地运行时出现 Travis CI 错误的 Selenium 测试失败。我收到一条错误消息,提示 Firefox 无法在 localhost 上建立与服务器的连接。我试图让测试在本地运行并失败,这样我就可以调试它而无需推送到 Travis CI 构建。我正在开发一个 Python-Flask 网络应用程序,该应用程序使用 docker 容器作为网络应用程序和 postgres 数据库。

这是测试:

def test_name_capitalization(mockdata, browser):
browser.get("http://127.0.0.1:5000/auth/login")
wait_for_page_load(browser)

test_pairs = [("mcDonald", "McDonald"), ("Mei-Ying", "Mei-Ying"),
("G", "G"), ("oh", "Oh")]

for test_pair in test_pairs:
test_input = test_pair[0]
test_output = test_pair[1]

# enter a name to test
browser.get("http://127.0.0.1:5000/officer/new")
wait_for_element(browser, By.ID, "name")
elem = browser.find_element_by_id("name")
elem.clear()
elem.send_keys(test_input)
browser.find_element_by_id("submit").click()

# get past the "Submit images" page
images_button = browser.find_element_by_class_name("btn btn-primary")
images_button.click()

# check result
wait_for_element(browser, By.TAG_NAME, "tbody")
rendered_field = browser.find_element_by_tag_name("h1").text
rendered_name = rendered_field.split(":")[1].strip()
assert rendered_name == test_output

在 Travis CI 中失败并出现以下错误:

            # get past the "Submit images" page
>           images_button = browser.find_element_by_class_name("btn btn-primary")
tests/test_functional.py:131: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../virtualenv/python3.6.3/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:563: in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
../../../../virtualenv/python3.6.3/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:966: in find_element
    'value': value})['value']
../../../../virtualenv/python3.6.3/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:320: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7ff1c16f0c50>
response = {'status': 404, 'value': '{"error":"no such element","message":"Unable to locate element: .btn btn-primary"}'}

当我在本地运行测试时输出不同。 我运行以下 name=test_name_capitalization make test 并在本地获取这些错误

tests/test_functional.py::test_name_capitalization 
[gw0] [100%] FAILED tests/test_functional.py::test_name_capitalization 
[gw0] [100%] ERROR tests/test_functional.py::test_name_capitalization         
_______________________________________________________________________________ ERROR at teardown of test_name_capitalization ________________________________________________________________________________
    [gw0] linux -- Python 3.7.2 /usr/local/bin/python

tp = <class 'selenium.common.exceptions.WebDriverException'>, value = None, tb = None

    def reraise(tp, value, tb=None):
        try:
            if value is None:
                value = tp()
            if value.__traceback__ is not tb:
                raise value.with_traceback(tb)
>           raise value

/usr/local/lib/python3.7/site-packages/six.py:693: 
`



self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7f4333fb0908>
response = {'status': 500, 'value': '{"value":{"error":"unknown error","message":"Reached error page: about:neterror?e=connection...tate@chrome://marionette/content/listener.js:277:21\\nhandleEvent@chrome://marionette/content/listener.js:245:9\\n"}}'}
`

再往下我也看到了

E       selenium.common.exceptions.WebDriverException: Message: Reached error page: about:neterror?e=connectionFailure&u=http%3A//127.0.0.1%3A5000/shutdown&c=UTF-8&f=regular&d=Firefox%20can%E2%80%99t%20establish%20a%20connection%20to%20the%20server%20at%20127.0.0.1%3A5000.

/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py:242: WebDriverException

我阅读了这个问题Selenium WebDriverException: Reached error page 并遵循了将 localhost 更改为 127.0.0.1 的建议,但我没有看到测试行为有任何变化。我还将端口从 5000 更改为 3000,因为我在 3000 上本地有 Web 应用程序,但这也没有改变任何东西。

谁能明白为什么这个测试在本地运行时的行为与在 Travis CI 构建中的行为不同?谢谢。

【问题讨论】:

    标签: python selenium docker travis-ci pytest


    【解决方案1】:

    Travis CI 的错误非常简洁明了。错误就在这一行:

    images_button = browser.find_element_by_class_name("btn btn-primary")
    

    find_element_by_class_name(name) 接受一个类名作为参数,而您传递了两个类名 btnbtn-primary

    解决方案是使用以下任一Locator Strategies

    • css_selector:

      images_button = browser.find_element_by_css_selector(".btn.btn-primary")
      
    • xpath:

      images_button = browser.find_element_by_xpath("//*[@class='btn btn-primary']")
      

    您的 localhost 的错误有点主观,因为它读取:

    selenium.common.exceptions.WebDriverException: Message: Reached error page: about:neterror?e=connectionFailure&u=http%3A//127.0.0.1%3A5000/shutdown&c=UTF-8&f=regular&d=Firefox%20can%E2%80%99t%20establish%20a%20connection%20to%20the%20server%20at%20127.0.0.1%3A5000.
    

    这表示500 Internal Server Error 由于在初始化 WebDriver / Web 浏览 会话时出现网络错误。详细讨论可以在Reached error page: about:neterror when trying to navigate to other tabs if there is a form submit under that tab

    【讨论】:

    • 嗨,看来我需要澄清一下我在问什么。我试图弄清楚为什么测试在本地运行时会引发错误。我不是在问 Travis CI 的失败,因为我更清楚其原因。
    • @ByteByByte 可能我的回答中已经涵盖了 Jenkins 和 localhost 失败案例。
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多