2

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

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

  1. 使用启动 2 个不同的显示器Xvfb -ac :99 and Xvfb -ac :100
  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 个不同的浏览器实例?
  2. 如果是,我该如何模拟?我只需要一个概念证明来证明上述事实。
4

1 回答 1

1

您可以创建一个 bash 文件,告诉在后台生成两个进程,这可以保证您的并发性,但不能保证并行性。

python screenshot99.py &
python screenshot100.py &

您可以做的是使用多处理模块创建一个旋转门锁 -

编辑 - 我应该指定即使这也不能保证并行性,但这更接近。如果需要,您必须指定要在其上运行的 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
于 2017-02-23T15:05:26.947 回答