首页 > 解决方案 > 如何通过 Python 使用 Device Farm 桌面浏览器会话

问题描述

我正在尝试使用 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-用法

我安装了 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.xamazon-web-servicesseleniumselenium-gridaws-device-farm

解决方案


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

  1. 根据pytest 文档,您似乎需要将测试放入以名称开头的文件中,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。CreateTestGridUrl在这种情况下, API 响应中给出的 AWS Device Farm 端点。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()


推荐阅读