如何解决如何通过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管理控制台中应该不会发生什么事情?
解决方法
您的代码似乎存在一些问题。
- 根据pytest documentaion,看来您需要将测试放入名称为
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设备群的终端节点。 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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。