python-3.x - 如何通过 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 管理控制台中不应该发生什么吗?
解决方案
您的代码似乎存在一些问题。
- 根据pytest 文档,您似乎需要将测试放入以名称开头的文件中,
test
并将测试放入以单词开头的方法中test
。这就是为什么您的代码都没有执行的原因。 - 该行
driver = webdriver.Firefox()
尝试创建本地 Firefox 驱动程序。您需要的是使用 AWS Device Farm 提供的 URL 的远程驱动程序(您可以在线上执行self.driver = webdriver.Remote("http://www.python.org", webdriver.DesiredCapabilities.FIREFOX)
- 线路
self.driver = webdriver.Remote("http://www.python.org", webdriver.DesiredCapabilities.FIREFOX)
不正确。第一个参数应该是用于执行测试的远程端点的 URL。CreateTestGridUrl
在这种情况下, API 响应中给出的 AWS Device Farm 端点。Selenium 基本上只是一个 REST 服务,因此它通过对端点的 REST 调用来执行操作,该端点告诉驱动程序要执行哪些操作。 - 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()
推荐阅读
- c# - VS 2008 MULTI LAYERS C# 项目在打开时出错
- c# - 将 NSubstitute 导入 Unity 项目
- sql - `DB2`中MS-SQL`QUOTENAME`的等价物是什么
- sql-server - 将递归存储过程包装在另一个过程中时出现“超出最大嵌套级别”错误
- php - mail() 无法发送带有 utf-8 的附件标题。带有 utf-8 内容的英文标题附件传递
- robotframework - 如何使用机器人框架验证文本,但除了一些文本之外
- angular - 算术运算的左侧必须是“any”、“number”、“bigint”类型或枚举类型
- flutter - 无法从 api 获取数据
- python - 从循环内的 a.href 获取数据
- python - Facebook 中洞察结果的分页