微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过Python使用Device Farm桌面浏览器会话

如何解决如何通过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-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 env变量,测试了连接性,并运行了以下代码

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管理控制台中应该不会发生什么事情?

解决方法

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

  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. 行中执行此操作
  4. self.driver = webdriver.Remote("http://www.python.org",webdriver.DesiredCapabilities.FIREFOX)行不正确。第一个参数应该是用于执行测试的远程端点的URL。在这种情况下,CreateTestGridUrl API响应中给出了其AWS设备群的终端节点。 Selenium基本上只是一种REST服务,因此它通过对端点的REST调用执行操作,告诉端点要执行哪些操作。
  5. 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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。