【问题标题】:How to use Device Farm desktop browser session with Python如何通过 Python 使用 Device Farm 桌面浏览器会话
【发布时间】:2020-09-11 15:55:28
【问题描述】:

我正在尝试使用 Device Farm 桌面浏览器会话在 Python 中运行 Selenium 测试,但由于缺乏资源(官方或非官方)以及我缺乏知识,我无法弄清楚。

我使用了这些文档: https://docs.aws.amazon.com/devicefarm/latest/testgrid/getting-started-migration.html https://selenium-python.readthedocs.io/getting-started.html#simple-usage

我安装了 GeckoDriver,并运行了以下代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()

我看到一个网络浏览器出现了大约一秒钟。

然后我决定使用 Device Farm。我设置了我的 AWS 环境变量,测试了连接性,并运行了以下代码:

import boto3
import pytest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys


class test_url:
    def setup_method(self, method):
        devicefarm_client = boto3.client("devicefarm", region_name="eu-west-1")
        testgrid_url_response = devicefarm_client.create_test_grid_url(
            projectArn="arn:aws:devicefarm:us-west-2:1234567890:testgrid-project:some-id-string",
            expiresInSeconds=300)
        self.driver = webdriver.Remote(
            "http://www.python.org", webdriver.DesiredCapabilities.FIREFOX)

    # later, make sure to end your WebDriver session:
    def teardown_method(self, method):
        self.driver.quit()

结果如下:

$ pytest -s
====================================================================================== test session starts =======================================================================================
platform linux -- Python 3.8.2, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: /home/eric/nuage/devicefarm-poc
collected 0 items                                                                                                                                                                                

===================================================================================== no tests ran in 0.07s ======================================================================================

我在 AWS 管理控制台中没有看到任何事情发生。

为什么没有测试运行?这段代码不应该执行 URL 测试吗?当我运行它时,AWS 管理控制台中不应该发生什么吗?

【问题讨论】:

    标签: python-3.x amazon-web-services selenium selenium-grid aws-device-farm


    【解决方案1】:

    您的代码似乎存在一些问题。

    1. 根据pytest documentaion,您似乎需要将测试放入以名称test 开头的文件中,并将测试放入以单词test 开头的方法中。这就是为什么您的代码都没有执行的原因。
    2. driver = webdriver.Firefox() 行尝试创建本地 Firefox 驱动程序。您需要的是使用 AWS Device Farm 提供的 URL 的远程驱动程序(您在 self.driver = webdriver.Remote("http://www.python.org", webdriver.DesiredCapabilities.FIREFOX) 行执行
    3. self.driver = webdriver.Remote("http://www.python.org", webdriver.DesiredCapabilities.FIREFOX) 行不正确。第一个参数应该是用于执行测试的远程端点的 URL。在这种情况下,它的 AWS Device Farm 的端点在 CreateTestGridUrl API 响应中给出。 Selenium 基本上只是一个 REST 服务,因此它通过对一个端点的 REST 调用来执行操作,该端点告诉驱动程序要执行哪些操作。
    4. AWS Device Farm 目前仅在 us-west-2 中。

    我建议您再次阅读 pytest、Selenium 和 AWS 文档,以了解它们如何协同工作。它并不太复杂,但如果您不知道所有工作部分如何相互交互,它可能会让人感到困惑。


    这里有一个 pytest 的“最小”示例,可以帮助您入门。

    import logging
    
    from selenium import webdriver
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    from selenium.webdriver.common.keys import Keys
    
    import boto3
    import pytest
    
    PROJECT_ARN = # Your project ARN
    
    # Currently, AWS Device Farm is only in us-west-2
    devicefarm = boto3.client('devicefarm', region_name='us-west-2')
    remote_url = devicefarm.create_test_grid_url(
        projectArn=PROJECT_ARN,
        expiresInSeconds=600 # 10 minutes. Increase to longer if needed
    )['url']
    
    
    @pytest.fixture(scope="module") # Specify "module" to reuse the same session
    def firefox_driver(request):
        # Start fixture setup
        logging.info("Creating a new session with remote URL: " + remote_url)
        remote_web_driver = webdriver.Remote(command_executor=remote_url, desired_capabilities=DesiredCapabilities.FIREFOX)
        logging.info("Created the remote webdriver session: " + remote_web_driver.session_id)
        yield remote_web_driver # Returns driver fixture and waits for tests to run
    
        logging.info("Teardown the remote webdriver session: " + remote_web_driver.session_id)
        remote_web_driver.quit()
        logging.info("Done tearing down")
    
    
    @pytest.mark.usefixtures("firefox_driver")
    def test_search_in_python_org(firefox_driver):
        driver = firefox_driver
        driver.get("http://www.python.org")
        assert "Python" in driver.title
        elem = driver.find_element_by_name("q")
        elem.clear()
        elem.send_keys("pycon")
        elem.send_keys(Keys.RETURN)
        assert "No results found." not in driver.page_source
        # driver.close() // This is done in the fixture instead of here now
    
    
    @pytest.mark.usefixtures("firefox_driver")
    def test_aws_console_title(firefox_driver):
        driver = firefox_driver
        driver.get("https://aws.amazon.com/")
        assert "Amazon Web Services" in driver.title
    
    
    if __name__ == '__main__':
        unittest.main()
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 2016-05-10
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多