2017-02-23 1 views
1

J'ai une exigence où je cours un manuscrit de sélenium qui ouvre 2 instances de Firefox sur une machine. Je veux prendre des captures d'écran des deux instances au même temps. La même partie de temps est importante.Prendre des captures d'écran en même temps Xvfb plusieurs affichages

I utilisé comme suit pour simuler ceci:

  1. Start 2 différents affichages à l'aide Xvfb -ac :99 and Xvfb -ac :100
  2. J'ai 2 scripts python qui définit la variable d'environnement DISPLAY à 99 et 100 respectivement.

Voici les scripts 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() 

et 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() 

J'ai 2 questions:

  1. Est-il même possible de prendre des captures d'écran de 2 différentes instances de navigateur au même temps?
  2. Si oui, comment puis-je simuler cela? J'ai juste besoin d'une preuve de concept pour prouver le fait ci-dessus.
+0

Vous pouvez FOURCHE deux processus ou fils cela prendra les captures d'écran lors de la réception d'un signal, et ma ke le processus parent envoie les signaux. Voir par exemple [ici] (http://stackoverflow.com/questions/27463626/make-a-thread-wait-for-either-a-timer-or-a-signal). – reinierpost

Répondre

1

Vous pouvez créer un fichier bash indiquant de générer deux processus en arrière-plan, ce qui vous garantit la concurrence mais pas le parallélisme.

python screenshot99.py & 
python screenshot100.py & 

Ce que vous pouvez faire est d'utiliser le module multiprocessing pour créer un verrou tourniquet -

EDIT - Je précise même cela ne garantit pas le parallélisme mais cela est plus proche. Vous devrez spécifier le CPU à exécuter si vous le souhaitez.

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

Résultats -

aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
aquiring... 
1487866323038 0 
1487866323038 1 

Je l'ai répété à plusieurs reprises (montrant juste le temps) -

1487866388886 0 
1487866388886 1 

Encore une fois -

1487866398492 0 
1487866398492 1 
+0

Merci. Je n'ai pas compris la partie de frai. Spawn quel script? Le script bash? – skjindal93

+0

Votre fichier 'screenshot.py'. [ou simplement écrire le code en ligne] – hashcode55

+0

Cela ne fonctionnera que si vous pouvez accéder au même port d'affichage en même temps. Sinon, je ne pense pas qu'il soit possible de garantir le parallélisme. Dans ce cas, vous devrez utiliser la solution de script bash. – hashcode55