2017-03-11 88 views
2

我對使用硒在python中的並行執行感到困惑。似乎有幾種方法可以解決這個問題,但有些似乎過時了。Python與硒並行執行

我想知道使用硒進行並行執行的最新方法是什麼?

有一個名爲python-wd-parallel的python模塊,它似乎有一些功能可以做到這一點,但是從2013年開始,這仍然有用嗎?

例如https://saucelabs.com/blog/parallel-testing-with-python-and-selenium-on-sauce-online-workshop-recap

我們也有併發,這似乎更新,但並不是很容易實現 - 任何人都有一個在硒中並行執行的工作示例?

還有一些使用線程和執行程序來完成工作,但我覺得這樣會比較慢,因爲它沒有使用所有內核,並且仍然以串行格式運行。

回答

1

使用joblib's Parallel模塊來做到這一點,它是一個很好的並行執行庫。

假設我們有一個名爲urls URL列表,我們希望把每一個截圖並行

首先讓進口必要的庫

from selenium import webdriver 
from joblib import Parallel, delayed 

現在,讓我們定義一個函數,截圖爲base64

def take_screenshot(url): 
    phantom = webdriver.PhantomJS('/path/to/phantomjs') 
    phantom.get(url) 
    screenshot = phantom.get_screenshot_as_base64() 
    phantom.close() 

    return screenshot 

現在執行的是並行你會做什麼

screenshots = Parallel(n_jobs=-1)(delayed(take_screenshot)(url) for url in urls) 

當該行完成執行時,您將在screenshots中獲得所有運行進程的所有數據。

說明有關並行

  • Parallel(n_jobs=-1)手段利用所有的資源,你可以
  • delayed(function)(input)joblib的你嘗試在平行
運行函數創建輸入方式

更多信息可在joblib文檔中找到

+0

是否有任何直接的方法來重複使用一個webdriver.PhantomJS實例爲一個n_jobs,而不是爲每個迭代關閉和打開? – sudonym

+1

你爲什麼要這麼做?嘗試從多個進程訪問一個webdriver實例似乎是個不錯的主意 - 我相信這會損害並行化。無論如何,如果你決定繼續這樣做,你將不得不使webdriver序列化 – bluesummers

+0

非常感謝。我的理由是每個進程都有一個驅動程序實例(對於多個進程,沒有一個驅動程序實例),因爲在列表中「如何加速硒」列表項「重用驅動程序實例」幾乎排在前列 – sudonym