当点击我们的生产URL时,Windows Docker容器上的Python Selenium问题

2024-09-28 22:04:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Docker容器的新手,所以我希望有人能指出一个问题,为什么我在Docker容器上尝试查找生产URL上的元素时,selenium测试总是失败

我正在尝试为我们的web应用程序在几个docker容器上同时运行登录测试。在我的主机上运行开发URL和生产URL时,该测试都非常有效,但只有在docker容器上点击开发URL时才通过。特别是,selenium在试图查找脚本中的第一个元素(登录页面上的用户名栏)时抛出Timeout异常。当我获取url本身时,它不会抛出错误,因此我想知道是否有某种安全措施正在发生,即识别有一个VM设备试图在页面上刮取元素。由于该测试适用于docker容器中的一个url(以及我的主机上的两个url),因此我相当确定代码应该可以工作,这是一些安全问题。不过,下面是我收到的代码和stacktrace的描述

按照测试设置的方式,pytest夹具被传递到testcase,其中包含浏览器信息(chrome浏览器)和应用程序信息(包括我们的“应用程序类”的实例,该类设置url、登录信息等,以匹配环境:web应用程序的Dev/Prod)。testcase然后通过调用login函数尝试登录。这利用了一个定制的find函数来查找与css选择器匹配的元素列表。我们需要这个列表的第一个元素,因此我们将索引[0]添加到find语句的末尾,如下所示:our_test_objects_browser.find('our_element')[0]。更具体地说,这里是login函数(来自我们的login类),该函数在查找self.user元素时被调用并失败:

    def login(self):
        self.browser.get(self.obc.obcUrl)
        search_form = self.browser.find(self.user)[0]
        search_form.clear()
        search_form.send_keys(self.obc.username)
        search_form = self.browser.find(self.password)[0]
        search_form.clear()
        search_form.send_keys(self.obc.password)
        search_form.submit()

调用此方法的testcase如下所示:

def test_valid_login(obj_to_test):
        start_time=time.time()
        obj_to_test.login()
        print("run_time is" +str(time.time()-start_time())

下面是故障的stacktrace:

================================== FAILURES ===================================
______________________________ test_valid_login _______________________________

obj_to_test = <obc.login.login.Login object at 0x0000026833AFD820>

    def test_valid_login(obj_to_test):
            start_time=time.time()
>           obj_to_test.login()

tests\obc\test_login.py:23:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
src\obc\login\login.py:25: in login
    search_form = self.browser.find(self.user)[0]
src\common\selenium_test.py:61: in find
    return (self.wait.until(expected_conditions.presence_of_all_elements_located(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="035a9153594f3ebe92663c5e4bc9b121")>
method = <selenium.webdriver.support.expected_conditions.presence_of_all_elements_located object at 0x0000026833ACAC10>
message = ''

    def until(self, method, message=''):
        """Calls the method provided with the driver as an argument until the \
        return value is not False."""
        screen = None
        stacktrace = None

        end_time = time.time() + self._timeout
        while True:
            try:
                value = method(self._driver)
                if value:
                    return value
            except self._ignored_exceptions as exc:
                screen = getattr(exc, 'screen', None)
                stacktrace = getattr(exc, 'stacktrace', None)
            time.sleep(self._poll)
            if time.time() > end_time:
                break
>       raise TimeoutException(message, screen, stacktrace)
E       selenium.common.exceptions.TimeoutException: Message:

c:\python\lib\site-packages\selenium\webdriver\support\wait.py:80: TimeoutException
============================== warnings summary ===============================
tests/obc/test_login.py::test_valid_login
  c:\python\lib\site-packages\urllib3\connectionpool.py:997: InsecureRequestWarning: Unverified HTTPS request is being made to host 'flexonboardingn1.paychex.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
    warnings.warn(

-- Docs: https://docs.pytest.org/en/latest/warnings.html
======================== 1 failed, 1 warning in 52.50s ========================

Tags: topytestselfbrowserform元素search