同时在多个Xvfb显示器上截取屏幕截图

3

我有一个需求,我正在运行一个Selenium脚本,在一台机器上打开了2个Firefox实例。我想同时对两个实例进行截屏,同时这个“同时”非常重要。

我使用以下步骤来模拟这个过程:

  1. 使用Xvfb -ac:99和Xvfb -ac:100启动2个不同的显示器
  2. 我有2个Python脚本,分别将环境变量DISPLAY设置为99和100。

以下是Python脚本:screenshot99.py

#!/usr/bin/env python

from pyvirtualdisplay import Display
from selenium import webdriver
import os

os.environ['DISPLAY'] = ':99'

display = Display(visible=0, size=(800, 600))
display.start()

browser = webdriver.Firefox()
browser.get('http://www.test.com')
browser.quit()

display.stop()

screenshot100.py

#!/usr/bin/env python

from pyvirtualdisplay import Display
from selenium import webdriver
import os

os.environ['DISPLAY'] = ':100'

display = Display(visible=0, size=(800, 600))
display.start()

browser = webdriver.Firefox()
browser.get('http://www.test.com')
browser.quit()

display.stop()

我有两个问题:

  1. 是否有可能同时截取两个不同浏览器实例的屏幕截图?
  2. 如果是,我该如何模拟呢?我只需要一个概念验证来证明上述事实。

你可以派生两个进程或线程,在接收到信号时进行屏幕截图,并使父进程发送信号。请参见例如此处 - reinierpost
1个回答

1
你可以创建一个bash文件,告诉它在后台生成两个进程,这样可以保证并发性,但不是并行性。
python screenshot99.py &
python screenshot100.py &

你可以使用 multiprocessing模块创建一种旋转门锁定方式。
编辑 - 我应该指出,即使如此也不能保证并行性,但这更接近实现。如果想要并行化,必须指定要运行的CPU。
from multiprocessing import Process, Value
import time

def f(i, counter):
    counter.value += 1
    while counter.value != 2 :
        print 'aquiring...'
    ####  CRITICAL SECTION #### 
    # spawn your script here using the os module or
    # just write the code in here 
    print int(round(time.time() * 1000)), i
    #### CRITICAL SECTION END ####

if __name__ == '__main__':
    counter = Value('i', 0)
    for num in range(2):
        Process(target=f, args=(num, counter)).start()

结果 -
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
aquiring...
1487866323038 0
1487866323038 1

我重复了多次(仅显示时间)-
1487866388886 0
1487866388886 1

再次提醒 -
1487866398492 0
1487866398492 1

你的screenshot.py文件。[或者直接将代码写在行内] - hashcode55
只有在同时访问相同的显示端口时,这才能起作用。如果不能保证并行性,我认为这是不可能的。在这种情况下,您将不得不使用bash脚本解决方案。 - hashcode55
但是同一个显示端口无法在不同的浏览器中同时运行两个网站并同时给我两个网站的截图。在同一个显示端口上,一个网站将被另一个网站隐藏。请注意,这是程序相关的内容。 - skjindal93
1
我将num作为参数传递,为什么不将其用作显示端口的参数呢?我认为这应该可以工作。 - hashcode55
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接