Docker 快速搞定 selenium grid 分布式测试

snake · May 11, 2017 · Last by 冷月醉夕阳 replied at November 24, 2018 · 5492 hits
本帖已被设为精华帖!

写这篇文章,似乎有点重复造轮子的嫌疑。当看了几篇相关文章后,还是觉得不够简单,于是还是把半年前的半成品给完成了。

以传统的方式部署分布式Selenium Grid集群需要耗费大量时间和机器成本来准备测试环境。

Snake用docker来搭建Selenium grid环境,用ptest框架来写代码,尝试简化这个过程。

屏幕快照 2017-05-10 下午11.46.56.png

NO.1 搭环境

首先你得把docker加个阿里云加速器,不然那个等待是漫长的。
写个docker-compose.yml

hub:
image: selenium/hub
ports:
- "4444:4444"
firefox:
image: selenium/node-firefox
ports:
- 5901:5900
links:
- hub
chrome:
image: selenium/node-chrome
ports:
- 5902:5900
links:
- hub

启动起来:

docker-compose up

看起来是这样的
Screen Shot 2017-05-10 at 5.30.39 PM.png
启动成功。
环境部分,就大功告成了。So easy!

NO.2 写代码

写了一个很简单的例子,用了同事写的ptest框架。
这个框架改进了很多市面上框架用起来不爽的地方,比如:报告,并发,写log, 传参等。

__author__ = 'anderson'

# coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import WebDriverWait

from ptest.decorator import TestClass, Test, BeforeMethod, AfterMethod

@TestClass(run_mode="parallel") # the test cases in this class will be executed by multiple threads
class SeleniumClass:
@BeforeMethod(description="Prepare test Enviroment.")
def before(self):
preporter.info("set up driver")
browser = config.get_property("browser")
if browser == "firefox":
self.driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.FIREFOX)
elif browser == "chrome":
self.driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.CHROME)

@Test(tags=["regression", "smoke"])
def test1(self):
preporter.info("start to test")
self.driver.get("http://www.baidu.com")
inputElement = self.driver.find_element_by_name("wd")
inputElement.send_keys("docker")
inputElement.submit()
WebDriverWait(self.driver, 20).until(lambda driver: driver.title.startswith("docker"))
assert_true(self.driver.title.startswith("docker"))

@AfterMethod(always_run=True, description="Clean up")
def after(self):
preporter.info("cleaning up")
self.driver.quit()

运行,得到结果:
Screen Shot 2017-05-10 at 5.19.03 PM.png
Oopos, 出错了!
Screen Shot 2017-05-10 at 5.19.59 PM.png
仔细看log和截图,原来是没有支持中文。
解决方案是: 换docker image 源,搜到了支持中文的。
重启后再运行。

Screen Shot 2017-05-10 at 6.00.48 PM.png
Nice!
Screen Shot 2017-05-10 at 5.59.00 PM.png

NO.3 并发

其实第二步里面已经打开了并发。运行的时候,输入并发数就可以了。

ptest3 -t test -n 2 -Dbrowser=firefox

这里的n是并发数,参数是firefox. 让firefox做为浏览器。(可以根据case 数量来设定)
当然,也可以在yml里面多注册几个hub, up to you!

感想

其实在这里,我都没做啥,只是做了个搬运工而已,报告,截图,并发,重跑等等,我都不用操心,只要设置几个参数就行。好的框架,能事半功倍。

ptest

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 5 条回复 时间 点赞
思寒_seveniruby 将本帖设为了精华贴 11 May 21:52

报告也是ptest框架的吗?

snake #3 · May 18, 2017 作者
infy001 回复

@infy001 Yes

oops 写错了?

5Floor has been deleted
snake 回复

你好,为什么我的pytest-html报告和你这个不一样,没你这个好看感觉,你是有修改么还是?

应该是对报告做了改动,能开源么,哈哈。。 还有个问题,就是这里多线程并发,能将不同的用例分发到不同的机器上面么,这个问题我想了很久,没好的方案

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up