https上的远程硒网格不起作用

时间:2018-08-23 23:25:28

标签: python-3.x selenium selenium-grid urllib3 pytest-selenium

我工作的公司要求/留下深刻的印象,即当使用我们在docker实例中托管在AWS中的远程硒网格服务器时,所有硒测试流量都必须通过https进行。

直到现在,这似乎一直有效,但是使用的是最新版本的硒3.14。现在,即使是最简单的测试,我也会收到100的“ InsecureRequestWarnings”。我已经诊断出这些是由与硒网格的https连接而不是测试目标url本身引起的,因为如果我从本地硒服务器和Webdriver运行相同的测试,则不会遇到相同的问题。

我正在使用以下内容: python 3.6.4,pytest 3.7.2,pytest-selenium 1.13,selenium 3.14(在本地和远程硒网格上),chromedriver 2.41(在本地和远程),certifi 2018.8.13,urllib3 1.23

从各种Windows框中运行(服务器2008,Windows 10等...)

运行以下代码(基本上是conftest.py和简单的登录测试脚本的组合)后,我收到以下警告(重复了62条)。

D:\Work\PyTestFramework\VirtEnv3_6\lib\site-packages\urllib3\connectionpool.py:857: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
    InsecureRequestWarning)

我的示例代码:

import pytest
import webdriverwrapper
import webdriverwrapper.wrapper
from webdriverwrapper import DesiredCapabilities

# testtools are just my reusable helper libraries
from testtools import credentials_helper, login_helper, appointment_helper



def pytest_addoption(parser):
    parser.addoption('--url', action='store', default='https://bookingportal.mycompany.com.au/OBP',
                     help='target machine url')


@pytest.fixture(scope='session')
def url(request):
    return request.config.getoption('url')


@pytest.fixture(scope='function')
def browser(request):
    desired_cap = DesiredCapabilities.CHROME
    desired_cap['chromeOptions'] = {}
    desired_cap['chromeOptions']['args'] = ['--disable-plugins', '--disable-extensions']
    desired_cap['browserName'] = 'chrome'
    desired_cap['javascriptEnabled'] = True
    hostname = "https://selenium.mygriddocker.com.au/wd/hub"
    executor = webdriverwrapper.wrapper.remote.remote_connection.RemoteConnection(hostname, resolve_ip=False)
    b = webdriverwrapper.Remote(executor, desired_cap)
    request.addfinalizer(lambda *args: b.quit())
    return b


@pytest.fixture(scope='function')
def driver(browser, url):
    driver = browser
    driver.set_window_size(1260, 1080)
    driver.get(url)
    return driver


# ------------ put test script here



@pytest.mark.usefixtures("driver")
def test_OBP_Login(driver):
    testId = 'LogIn01'
    credentials_list = credentials_helper.get_csv_data('OBP_LoginDetails.csv', testId)

    assert driver.title == 'Booking Portal'
    rslt1 = login_helper.login_user(driver, credentials_list)
    assert rslt1

    rslt2 = appointment_helper.logout_OBP(driver)
    assert rslt2

如您所见,我正在呼叫的硒网格服务器的地址是 https://selenium.mygriddocker.com.au/wd/hub(不是实际的真实地址)

并且我已经验证它确实具有由公共机构(Comodo)颁发的有效证书。 请注意,如果我回滚到urllib3和certifi,但没有问题,但是我不确定它在什么时候停止工作

很多人只是取消了警告,但我实际上希望证书有效。

显而易见的解决方案是按照链接的建议添加证书验证,但是问题是如何通过硒RemoteConnection类发送连接池管理器参数?

来自https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl的建议修复程序:

 import certifi
 import urllib3
 http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())

当我进入硒库时,我发现使用urllib3.PoolManager位于remote_connection模块中,但是在调用PoolManager时它没有任何可用于通过附加信息发送的参数。您可以在示例代码中看到executor对象是我调用remote_connection的地方(通过webdriverwrapper,在常规selenium中,路径为selenium / webdriver / remote / remote_connection)

RemoteConnection类没有设置我可以看到的PoolManager。

我尝试仅编辑remote_connection,以期将认证信息硬编码到文件中,以期找出以后如何包装它。所以我在看到urllib3.PoolManager()的地方添加了cert_reqs='CERT_REQUIRED', ca_certs=certifi.where()行(我还将certifi导入了该模块)。通过一些令人惊讶的愚蠢运气,它实际上起作用了。现在我不知道如何包装它。

有人对通过https进行远程硒工作有其他想法吗?

1 个答案:

答案 0 :(得分:0)

因此我发现,在硒3.13和3.14之间,他们将http请求库从httplib更改为urllib3,并且似乎没有适当地处理证书。

所以我发现他们的选择是:1)使用硒3.13客户端2)使用硒3.14客户端并禁用InsecureRequestWarnings导入urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

3)使用硒3.14客户端并破解remote_connections.py文件,将所有urllib3.PoolManager()实例替换为urllib3.PoolManager(cert_reqs ='CERT_REQUIRED',ca_certs = certifi.where())

要注意的另一件事是,我认为Pycharm会缓存库,因此,如果我执行pip更新并且不清除缓存,则会混入混合结果

4)以某种方式将remote_connection.py包装到我自己的库中,并导入添加PoolManager参数的类-这超出了我的能力。

这不再是一个问题,而是我的信息可以帮助其他一些在远程硒调用上使用https时收到urllib3不安全警告的人。