GVKun编程网logo

如何视频记录在docker内部无头运行的selenium测试?(docker selenium)

15

在本文中,我们将详细介绍如何视频记录在docker内部无头运行的selenium测试?的各个方面,并为您提供关于dockerselenium的相关解答,同时,我们也将为您带来关于Docker+sele

在本文中,我们将详细介绍如何视频记录在docker内部无头运行的selenium测试?的各个方面,并为您提供关于docker selenium的相关解答,同时,我们也将为您带来关于Docker + selenium + jenkins 并行跑自动化测试、docker中运行selenium-remote的坑、Docker,Django和Selenium-Selenium无法连接、Firefox(无头)+ Selenium无法从Docker容器访问Internet的有用知识。

本文目录一览:

如何视频记录在docker内部无头运行的selenium测试?(docker selenium)

如何视频记录在docker内部无头运行的selenium测试?(docker selenium)

我正在使用无头firefox在docker内部运行python-selenium测试。

在这些测试中,我可以使用selenium方法来制作屏幕快照,但是我可以在整个测试过程中使用某些东西来“视频”记录虚拟显示(使用几种测试方法的多个测试脚本,其中有许多启动和停止的webdriver)。

那么如何录制完整的测试会话呢?

附录
:我找到了一个网页,该网页准确描述了我的需求:这里。不幸的是,当我尝试进行录制时出现错误。这是我正在执行的命令:

xvfb-run --listen-tcp --server-num 44 --auth-file /tmp/xvfb.auth -s "-ac -screen 0 1920x1080x24" python seltest.py &ffmpeg -f x11grab -video_size 1920x1080 -i 127.0.0.1:44 -codec:v libx264 -r 12 /tmp/behat_1.mp4

错误是(对于第二个命令):

[x11grab @ 0x1d289c0] Cannot open display 127.0.0.1:44, error 1.127.0.0.1:44: Input/output error

答案1

小编典典

记录虚拟显示的正确步骤ffmpeg是:

xvfb-run --listen-tcp --server-num 44 --auth-file /tmp/xvfb.auth -s "-ac -screen 0 1920x1080x24" python seltest.py &export DISPLAY=:44ffmpeg -f x11grab -video_size 1920x1080 -i :44 -codec:v libx264 -r 12 video.mp4

Docker + selenium + jenkins 并行跑自动化测试

Docker + selenium + jenkins 并行跑自动化测试

背景

目标:使用 docker 做 UI 自动化测试并在 Jenkins 运行

调试环境:MocOS

运行环境:Linux ubuntu + docker

涉及工具:docker,selenium,unittest, jenkins

基本思路

找一个适合做自动化的 docker 镜像,使用 selenium-grid 远程执行 selenium。镜像采用 elgalu/selenium,已经集成了 UI,chrome/firefox 等浏览器,包括 webdriver 驱动,十分方便。

镜像仓库地址:

https://github.com/elgalu/docker-selenium

接下来开工:

1. 在 elgalu/selenium 基础上简单编译

为了方便,脚本代码运行也设置在镜像里面。因此定制了我们自己的镜像文件:

FROM elgalu/selenium
RUN sudo apt-get update -y \
&& sudo pip install selenium \
&& mkdir /home/seluser/automation/myScript
ADD . /home/seluser/automation/myScript 
WORKDIR /home/seluser/automation/myScript  #定义工作目录

2. 用 Python+selenium 编写测试用例

if REMOTE:  # 定义一个开关变量方便本地和远程调试切换
    selenium_grid_url = "http://guest.docker:24444/wd/hub"
    capabilities = webdriver.DesiredCapabilities.CHROME.copy()
    d = webdriver.Remote(command_executor=selenium_grid_url, desired_capabilities=capabilities) #通过selenium启动docker里面chrome 
else:
    d = webdriver.Chrome()  #通过selenium启动本地chrome
    ##具体的UI测试代码

此处是启动 selenium 或者或者 selenium -grid 部分主要代码,不能直接运行。如果需要调用远程的 selenium_grid 需要 URL 加端口号的形势 http://guest.docker:24444/wd/hub,guest.docker 是 docker 内网分配的 IP,因为在 docker 里面的 host 文件没有发现容器名和 IP 的映射,因此从 docker 里面 hosts 文件选用 guest.docker 这个名字,等发现更好解决方案后再更新。

3. 执行和调试

本地调试不再多说,主要说一下怎么在 docker 调试和运行。先启动容器:

执行命令 :

docker* run --rm -p 5904:25900 -p 4444:24444 -v "$(pwd)":/home/seluser/automation/myScript --name automation-container automation-test:latest

启动成功之后可以通过 vnc 工具查看容器的 UI 界面

简单说明一下参数,5904 是 VNC 需要用到的端口,可以通过本地 VNC(127.0.0.1:5904)工具查看 case 运行效果。4444 是 selenium grid 的映射端口。-v 是把本地磁盘挂载到容器,方便代码调试,因为采用 $(pwd),表示当前路径,所以执行 docker 启动命令时候应该在自动化脚本所在位置。

现在本地调试 case,注意这个时候 selenium_grid_url 值应该是 http://localhost:4444/wd/hub

最后在容器里面执行 case,可以通过 docker exec 名执行,比如 docker exec -it container_name python /home/seluser/automation/myScript/example.py 确认没有没有问题后可以上 Jenkins 测试

需要注意的是如果 case 运行失败 selenium grid 是不会自动退出的,此处借助 Python unit test 的 teardown 方法结束 selenium 进程,比如:

def tearDown(self):
       print("start to teardown")
       time.sleep(10)
       self.d.close()
       self.d.quit()

运行脚本,可以再 VNC 看到运行效果:

4. 在 Jenkins 运行

跟本地容器执行步骤一直,同样的可以通过 VNC 监测执行过程。此处启动容器和关闭容器单独做成了两个 job,方便处理环境问题。

Jenkins 上面执行 docker exec -it 时候碰到一个 "The input device is not a TTY" 错误。减少一个 T 参数可以解决。

jenkins 并行运行多个容器

因为我们是通过容器化的方式启动的 UI 测试环境,同一个宿主机是可以启动多个容器的。假设我们的 UI 测试用例比较多的时候,我们可以同时运行多个容器来减少 UI case 的运行时间,配置方式比 jenkins 的分布式运行又更方便,怎么实现呢?启动多个容器我们只需要改变容器名字和映射的端口号即可,比如把前面启动容器命令简单更新一下

docker run --rm -p 5906:25900 -p 4466:24444 -v "$(pwd)":/home/seluser/automation/myScript --name automation-container-robot -d automation-test-robot

此处我们只更新了端口(5906,4466)和容器名字,就能启动多个 UI 环境并行运行 case,是不是很爽哦?

执行完之后需要强制关闭容器,防止异常退出情况。启动容器和关闭容器单独做成了两个 job,方便处理环境问题。

 

到此处基本大功告成。

结语

 最后跟大家推荐一个测试学习群:747981058,里面大牛已经为我们整理好了许多的学习资料,有自动化,接口,性能等等的学习资料!

人生是一个逆水行舟的过程,不进则退,咱们一起加油吧!

docker中运行selenium-remote的坑

docker中运行selenium-remote的坑

在本地起docker容器,运行selenium的时候踩了一些坑,先简单记录,后续梳理后再完善:

 

 一、构建运行环境-容器

1、先起selenium运行的Chrome容器:

docker run -d -p 4444:4444 -p 5900:5900  --shm-size 2g selenium/standalone-chrome-debug:3.141.59-20200525

参数简析:

4444的端口映射是远端Chrome的地址,在代码中触发driver的运行部分为:

selenium_grid_url = "http://docker_chromeIP:4444/wd/hub"        # docker_chromeIP是selenium-chrome-debug容器运行的IP,需要用inspect去查看确认。
        driver = webdriver.Remote(command_executor=selenium_grid_url,
                                  desired_capabilities=caps)

 

1.1、5900端口映射是虚拟Chrome界面的启动端口号,这个是standalone-chrome-debug特有的;

1.2、在Mac端的启动方法是在finder中打开server链接,然后链接vnc://localhost:5900 密码默认为secret,就可以看到远端Chrome运行时候的情况了。

  注意,这里需要用localhost,而不是容器里面的IP,因为在起容器的时候,映射的IP是到主机的,然后起模拟Chrome的操作也是在本机进行的,这样才能ping通。

1.3、--shm-size 2g 这个的设置是Chrome-driver8.0版本以上,因为缓存不足会报错导致的,填上这个参数就不会了,解决方法是Google来的,忘记具体的报错信息了,所以说应该随时顺手记下来了的。。。

注意,还有一个镜像是standalone-chrome,这个与上面debug的区别就是没有虚拟的Chrome界面展示,在运行的时候,发现用standalone-chrome镜像的话,对界面截图就会失败,为timeout,替换为debug版本就可以了。

 

2.1、再起pytest容器:

docker run -d -v `pwd`:/data -t xharbor.i-tetris.com:5000/public/pytest:v1.0 cat

 

注意这个容器起的时候,需要在本机定位到脚本运行的根目录,因为'pwd'嘛。

 

 

二、运行脚本——在docker中运行selenium脚本:

进入selenium容器中,在data目录下执行pytest即可。

Docker,Django和Selenium-Selenium无法连接

Docker,Django和Selenium-Selenium无法连接

我已经将Docker配置为使用docker-compose.yml运行Postgres和Django,并且工作正常。

我遇到的麻烦是Selenium无法连接到Django liveserver。

现在(至少对我而言),django必须访问selenium才能控制浏览器,而selenium必须访问django才能访问服务器。

我已经尝试从此处使用docker-
compose.yml的以下配置使用docker’大使’模式:https
:
//github.com/docker/compose/issues/666

postgis:
  dockerfile: ./docker/postgis/Dockerfile
  build: .
  container_name: postgis

django-ambassador:
  container_name: django-ambassador
  image: cpuguy83/docker-grand-ambassador
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
  command: "-name django -name selenium"

django:
  dockerfile: ./docker/Dockerfile-dev
  build: .
  command: python /app/project/manage.py test my-app
  container_name: django
  volumes:
    - .:/app
  ports:
    - "8000:8000"
    - "8081:8081"
  links:
    - postgis
    - "django-ambassador:selenium"
  environment:
    - SELENIUM_HOST=http://selenium:4444/wd/hub

selenium:
  container_name: selenium
  image: selenium/standalone-firefox-debug
  ports:
    - "4444:4444"
    - "5900:5900"
  links:
    - "django-ambassador:django"

当我检查http:// DOCKER-MACHINE-IP:4444 / wd / hub / static / resource /
hub.html时,

我可以看到Firefox启动了,但是由于Firefox无法连接到Django,所有测试都失败了

'Firefox can't establish a connection to the server at localhost:8081'

我也在这里https://github.com/docker/compose/issues/1991尝试了此解决方案,
但是这不起作用,因为我无法让django同时连接到Postgis和Selenium

'django.db.utils.OperationalError: could not translate host name "postgis" to address: Name or service not known'

我尝试使用下面列出的网络功能

postgis:
  dockerfile: ./docker/postgis/Dockerfile
  build: .
  container_name: postgis
  net: appnet

django:
  dockerfile: ./docker/Dockerfile-dev
  build: .
  command: python /app/project/manage.py test foo
  container_name: django
  volumes:
    - .:/app
  ports:
    - "8000:8000"
    - "8081:8081"
  net: appnet
  environment:
    - SELENIUM_HOST=http://selenium:4444/wd/hub

selenium:
  container_name: selenium
  image: selenium/standalone-firefox-debug
  ports:
    - "4444:4444"
    - "5900:5900"
  net: appnet

但结果是一样的

'Firefox can't establish a connection to the server at localhost:8081'

那么我怎样才能使selenium连接到Django?

我已经玩了好几天了-非常感谢您的帮助。

更多信息

另一个怪异的事情是,如果我运行./manage.py test foo,那么当测试服务器运行时 使用docker
(使用我的virtualenv等旧配置)时,我可以通过http://
localhost:8081上的
任何浏览器访问服务器,并且获取提供的网页,但是如果我在docker下运行等效命令,则无法访问测试服务器。这很奇怪,因为我正在映射端口8081:8081-这与之相关吗?

注意:我正在使用OSX和Docker v1.9.1

Firefox(无头)+ Selenium无法从Docker容器访问Internet

Firefox(无头)+ Selenium无法从Docker容器访问Internet

如何解决Firefox(无头)+ Selenium无法从Docker容器访问Internet?

我已经通过C测试了Internet连接,并且该连接是在docker内部工作的。但是,当我运行带有硒python绑定的无头firefox时,硒穿过A

B

但是当我从主机运行相同的python文件时,它运行得很好。

(请不要建议我使用docker-selenium映像。我有理由不使用它们。除更改基本映像外,欢迎任何建议或查询。)

下面是run.py:

wget https://www.google.com

以下是Dockerfile:

TimeoutException

我的容器构建和运行命令是:

>> docker run myselcontainer

Traceback (most recent call last):
  File "run.py",line 24,in <module>
    driver = webdriver.Firefox(service_log_path=os.devnull,options=options,capabilities=capabilities,firefox_profile=profile)
  File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/firefox/webdriver.py",line 170,in __init__
    RemoteWebDriver.__init__(
  File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py",line 157,in __init__
    self.start_session(capabilities,browser_profile)
  File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py",line 252,in start_session
    response = self.execute(Command.NEW_SESSION,parameters)
  File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py",line 321,in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py",line 242,in check_response
    raise exception_class(message,screen,stacktrace)
selenium.common.exceptions.TimeoutException: Message: Connection refused (os error 111)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

关于如何视频记录在docker内部无头运行的selenium测试?docker selenium的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Docker + selenium + jenkins 并行跑自动化测试、docker中运行selenium-remote的坑、Docker,Django和Selenium-Selenium无法连接、Firefox(无头)+ Selenium无法从Docker容器访问Internet等相关知识的信息别忘了在本站进行查找喔。

本文标签: