3 votes

Comment exécuter plusieurs programmes python webdriver en même temps ?

J'ai 4 scripts Python (3 pilotes web et un scripts principal). J'aimerais ouvrir ces 3 pilotes web en même temps lorsque j'exécute la commande mainscript.py . J'ai utilisé le multiprocessing mais vous pouvez utiliser ce que vous voulez.

Maintenant, il s'ouvre bot_1.py et ensuite bot_2.py et ensuite bot_3.py .

bot_1.py

from selenium import webdriver

driver = webdriver.Chrome(executable_path="C:\\Users\Andrei\Downloads\chromedriver_win32\chromedriver.exe")
links=['https://ro.wikipedia.org/wiki/Emil_Constantinescu','https://ro.wikipedia.org/wiki/Traian_B%C4%83sescu','https://ro.wikipedia.org/wiki/Napoleon_I']
for i in range(len(links)):
    driver.get(links[i])

bot_2.py

from selenium import webdriver

driver = webdriver.Chrome(executable_path="C:\\Users\Andrei\Downloads\chromedriver_win32\chromedriver.exe")

links=['https://ro.wikipedia.org/wiki/Abraham_Lincoln','https://ro.wikipedia.org/wiki/Winston_Churchill','https://ro.wikipedia.org/wiki/Mihail_Gorbaciov']
for i in range(len(links)):
    driver.get(links[i])

bot_3.py

from selenium import webdriver

driver = webdriver.Chrome(executable_path="C:\\Users\Andrei\Downloads\chromedriver_win32\chromedriver.exe")

links = ['https://ro.wikipedia.org/wiki/Gabriela_Firea', 'https://ro.wikipedia.org/wiki/Ion_Iliescu',
         'https://ro.wikipedia.org/wiki/Mihai_Eminescu']
for i in range(len(links)):
    driver.get(links[i])

mainscript.py

import bot_1, bot_2, bot_3
import multiprocessing

for bot in ('bot_1', 'bot_2','bot_3'):
    p = multiprocessing.Process(target=lambda: __import__(bot))
    p.start()

4voto

Alichino Points 677

PyTest avec le xdist L'extension est une option : https://docs.pytest.org/en/3.0.0/xdist.html

pip install pytest
pip install pytest-xdist

Ensuite, vous exécutez pytest -n NUM donde NUM est le nombre de processus (ou dans votre cas, d'instances de webdriver) que vous souhaitez exécuter. Je ne me souviens plus exactement, mais je pense que la commande ci-dessus lance tous les processus de .py dans votre dossier actuel.

Vous pouvez également utiliser Behave + behave-parallel.

https://github.com/hugeinc/behave-parallel

3voto

Alexey Dolgopolov Points 471

Cela fonctionne en parallèle. Mais ce n'est peut-être pas évident, car pour moi c'était deux fenêtres qui se chevauchaient. J'ai donc ajouté time.sleep

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from  multiprocessing import Process
#import time

def run(urls):
#    print ("run", urls)
    options = Options()
    options.add_argument('--no-sandbox')
    options.add_argument('--no-default-browser-check')
    options.add_argument('--disable-gpu')
    options.add_argument('--disable-extensions')
    options.add_argument('--disable-default-apps')
    options.binary_location = '/opt/chrome-linux.63.0.3239.b.508580/chrome'
    driver = webdriver.Chrome(
                executable_path='/opt/chromedriver/chromedriver',
                options=options,
                )

    for url in urls:
#        time.sleep(5)
        driver.get(url)
#        print driver.title
    driver.quit()

allurls = [
        ['http://ya.ru', 'http://google.ru'],
        ['https://ro.wikipedia.org/wiki/Emil_Constantinescu',
            'https://ro.wikipedia.org/wiki/Traian_B%C4%83sescu'],
        ]

processes = []
for urls in allurls:
    p = Process(target=run, args=(urls,))
    processes.append(p)
    p.start()

for p in processes:
    p.join()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X