2015-12-21 53 views
0

我在写一个代码,可以打开3个Selenium Webdrivers。从线程获取返回的对象

from selenium import webdriver 
b1 = webdriver.Firefox() 
b2 = webdriver.Firefox() 
b3 = webdriver.Firefox() 

浏览器加载需要很多时间,我想并行加载它。 我虽然要使用线程,但我怎样才能从线程返回b1,b2,b3?

我的意思是,如果我有这样的功能:

def open_browser(): 
    return webdriver.Firefox() 

与它的线程会看起来像:

b1 = threading.Thread(target=open_browser, args=()) 

,但返回的值,该浏览器实例,不设置成B1。

我该怎么做?

+0

当然不是:'b1'是刚刚创建的Thread对象。请参阅[这里](https://pymotw.com/2/threading/)以供参考。顺便说一句,我严重怀疑使用线程会使事情变得更好... – Pynchia

+1

如果你不满意,因为Firefox速度很慢,我建议你使用PhantomJS – Macabeus

+0

@Pynchia我只是想将它们并行加载.. – Dan

回答

-1

只要把变量范围

import threading 
from selenium import webdriver 

b1 = None 
b2 = None 
b3 = None 
b_list = [b1, b2, b3] 
url_list = ['https://www.google.com.br/', 'http://stackoverflow.com/', 'https://www.youtube.com/'] 


def open_browser(b_index, url): 
    b_list[b_index] = webdriver.Firefox() 
    b_list[b_index].get(url) 

thread_list = [] 
for index, url in zip(range(len(b_list)), url_list): 
    thread_list.append(
     threading.Thread(target=open_browser, args=(index, url)) 
    ) 

for i in thread_list: 
    i.start() 

for i in thread_list: 
    i.join() 

print('finish') 

for i in b_list: 
    print(i.current_url) 

之外的另一种方式来优化是使用PhantomJS。它比Firefox更快。

2

看看Futures。他们应该允许你像这样运行代码:

N = 3 
with ThreadPoolExecutor(max_workers=N) as executor: 
    # start three Firefoxes in parallel 
    futures = [executor.submit(webdriver.Firefox) for i in range(N)] 
    # wait for all of them to be started 
    browsers = [f.result() for f in futures] 
相关问题