在我的 bash 脚本使用 selenium 服务器完成后,脚本会像这样杀死它:
kill `ps -ef | grep selenium | awk '{ print $2 }'`
Run Code Online (Sandbox Code Playgroud)
虽然这有效并且它确实杀死了 selenium 脚本,但它也尝试grep selenium
终止进程,因此当进程号返回到 kill 命令时,进程已经消失,因此最终生成错误消息。(换句话说:它最终杀死了两个进程,其中一个是真正的 selenium 服务器,另一个是一个短暂的进程,它是我执行此命令的方式的副作用。)
有没有更优雅的方式来终止进程,没有这种意外的副作用?
(FWIW 我有一个想法:这个相同的脚本在脚本的早期启动了 selenium,所以也许如果有一种方法可以在我启动 selenium 时捕获 PID,我可以保留它并直接杀死它,而不是 grepping for进程 ID。问题是,我不知道如何获取该 PID、如何使用变量来保留它以及如何在脚本中稍后引用它。但这是更好的方法吗?)
我正在使用 bash 脚本启动 Selenium 服务器,正如您从下面日志中的时间戳中看到的那样,这件事需要大约 32 秒才能完全上线:
Feb 28, 2012 10:19:02 PM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a standalone server
22:19:02.835 INFO - Java: Sun Microsystems Inc. 20.0-b11
22:19:02.836 INFO - OS: Linux 2.6.32-220.4.1.el6.x86_64 amd64
22:19:02.852 INFO - v2.19.0, with Core v2.19.0. Built from revision 15849
22:19:02.988 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
22:19:02.990 INFO - Version Jetty/5.1.x
22:19:02.992 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
22:19:02.993 INFO - Started HttpContext[/selenium-server,/selenium-server]
22:19:02.993 INFO - Started HttpContext[/,/]
22:19:34.552 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@488e32e7
22:19:34.552 …
Run Code Online (Sandbox Code Playgroud) 根据这个问题的答案,我正在运行 Xvfb 来进行虚拟显示,因此 Firefox 将在我的 CentOS 服务器上运行。(我不需要看到 firefox 或使用 firefox 执行任何实际的键或屏幕输入/输出——它只需要运行以便 Selenium 可以驱动它。)我试图弄清楚为什么 Xvfb(或 firefox)正在抛出一堆错误。
我使用以下命令启动 Xvfb:
Xvfb :1 -screen 0 1024x768x24 &
Run Code Online (Sandbox Code Playgroud)
在我启动它之后,屏幕上立即回显了几条错误消息(奇怪的是,它们出现在 shell 提示之后):
[root@host /home/lm/cron]# Xvfb :1 -screen 0 1024x768x24 &
[1] 9214
[root@host /home/lm/cron]# expected keysym, got XF86TouchpadOn: line 120 of inet
expected keysym, got XF86TouchpadOff: line 121 of inet
Run Code Online (Sandbox Code Playgroud)
当我运行 Selenium 测试脚本时,Selenium 日志中会出现更多错误:
5 XSELINUXs still allocated at reset
SCREEN: 0 objects of 176 bytes = 0 total bytes 0 private allocs
DEVICE: …
Run Code Online (Sandbox Code Playgroud)