0

Я работаю над проектом, который нуждается в автоматизации передачи данных и веб-слом, для которых я использую Селен и BeautifulSoup (python2.7).Многопоточность в селеном питона

Я хочу открыть только один экземпляр веб-браузера и войдите на сайт, держа эту сессию, я пытаюсь открывать новые вкладки, которые будут независимо друг от друга контролируемых потоков, каждый поток контролируя вкладку и выполнять свою задачу. Как я должен это делать? Примерный код будет приятным. Ну вот мой код:

def threadFunc(driver, tabId): 
    if tabId == 1: 
     #open a new tab and do something in it 
    elif tabId == 2: 
     #open another new tab with some different link and perform some task 
    .... #other cases 


class tabThreads(threading.Thread): 

    def __init__(self, driver, tabId): 
     threading.Thread.__init__(self) 
     self.tabID = tabId 
     self.driver = driver 

    def run(self): 
     print "Executing tab ", self.tabID 
     threadFunc(self.driver, self.tabID) 

def func(): 
    # Created a main window 

    driver = webdriver.Firefox() 
    driver.get("...someLink...") 

    # This is the part where i am stuck, whether to create threads and send 
    # them the same web-driver to stick with the current session by using the 
    # javascript call "window.open('')" or use a separate for each tab to 
    # operate on individual pages, but that will open a new browser instance 
    # everytime a driver is created 

    thread1 = tabThreads(driver, 1) 
    thread2 = tabThreads(driver, 2) 
    ...... #other threads 

Я открыт для предложений по использованию любого другого модуля при необходимости

+0

Вы можете сделать то же самое вручную, обрабатывать одновременно несколько вкладок браузера? Наверное, не ... «Селен» тоже не сможет этого сделать – Andersson

ответ

0

Я понимаю, что водители Селен не поточно-. В спецификации WebDriver раздел «Безопасность потока» пуст ... что я подразумеваю, что они вообще не рассматривали тему. https://www.w3.org/TR/2012/WD-webdriver-20120710/#thread-safety

Таким образом, если вы можете предоставить ссылку на драйвер с несколькими потоками и совершать вызовы к драйверу из нескольких потоков, нет гарантии, что драйвер сможет обрабатывать несколько асинхронных вызовов правильно.

Вместо этого вы должны либо синхронизировать вызовы из нескольких потоков, чтобы обеспечить их завершение до следующего запуска, либо у вас должен быть только один поток, вызывающий вызовы Selenium API ... возможность обработки команд из очереди, заполняемой несколькими другими потоки.

Также см Can Selenium use multi threading in one browser?

Смежные вопросы