同时截取Xvfb多屏幕截图

时间:2017-02-23 14:38:54

标签: python selenium screenshot xvfb pyvirtualdisplay

我有一个要求,我在运行一个selenium脚本,在一台机器上打开2个Firefox实例。我想在同时截取两个实例的屏幕截图。同时部分很重要。

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

  1. 使用 if (response == null || response.StatusCode != HttpStatusCode.OK) return DictionaryPIResponseNullFound.Value;
  2. 启动2个不同的显示
  3. 我有2个python脚本,它们分别将环境变量DISPLAY设置为99和100。
  4. 以下是python脚本: 的 screenshot99.py

    Xvfb -ac :99 and Xvfb -ac :100

    screenshot100.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()
    

    我有两个问题:

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

1 个答案:

答案 0 :(得分: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