Div*_*ani 5 python multithreading selenium-webdriver
我想同时打开和登录 5 个选项卡,而在选项卡之间没有延迟。我试过了:
import threading
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def openurl(threadId):
print(threading.currentThread().getName(),' Thread')
url = ('https://www.facebook.com/')
print(url)
driver.execute_script("window.open('{0}')".format(url))
#driver.title(threadId)
time.sleep(0.1)
driver.set_window_size(920, 680)
driver.find_element(By.ID, "email").send_keys("xx")
driver.find_element(By.ID, "pass").send_keys("yy")
driver.find_element(By.ID, "loginbutton").click()
if __name__=='__main__':
driver = webdriver.Chrome()
windows_before = driver.current_window_handle
for i in range(5):
t1 = threading.Thread(name=i,target=openurl, args=(i,))
t1.start()
t1.join()
Run Code Online (Sandbox Code Playgroud)
但它正在抛出:
回溯(最近一次调用):文件“C:\Users\1024983\AppData\Local\Programs\Python\Python37\lib\threading.py”,第 870 行,运行 self._target(*self._args, ** self._kwargs) 文件“C:\Users\1024983\AppData\Local\Programs\Python\Python37\fb-thread.py”,第 30 行,在 openurl driver.find_element(By.ID, "email").send_keys( “xx”)文件引发异常类(消息,屏幕,堆栈跟踪)selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法定位元素:{“方法”:“css选择器”,“选择器”:“[id ="email"]"}(会话信息:chrome=78.0.3904.108)
如果我增加睡眠时间,标签之间会有延迟。我尝试使用driver.title进行导航,但所有选项卡的案例标题都相同。
该示例使用线程来运行单独的浏览器,这些浏览器填充表单并True在列表中设置buttons以通知login按钮已准备好单击。当所有浏览器都True在列表中设置buttons后,所有浏览器都单击按钮。
看起来它几乎是同时运行的 - 也许只有系统有一些可以同时建立如此多的连接。
我使用列表buttons来同步所有线程。每个线程都会获得编号,以便在列表中拥有自己的位置。我不使用,append(True)因为我不确定它是否可以是线程安全的。
import time
from selenium import webdriver
from threading import Thread
def func(number):
driver = webdriver.Chrome()
#driver.set_window_size(920, 680)
driver.get(url)
driver.find_element_by_id("email").send_keys("xx")
driver.find_element_by_id("pass").send_keys("yy")
b = driver.find_element_by_id("loginbutton")
buttons[number] = True
print(buttons)
# wait for other buttons
while not all(buttons):
pass
print('click', number)
b.click()
# ---
url = 'https://www.facebook.com/'
number_of_threads = 5
#buttons = [False * number_of_threads] # create place
buttons = []
threads = []
for number in range(number_of_threads):
t = Thread(target=func, args=(number,)) # get number for place in list `buttons`
t.start()
threads.append(t)
buttons.append(False) # create place
for t in threads:
t.join()
Run Code Online (Sandbox Code Playgroud)
编辑:与 5 个线程相同,threading.Barrier(5)必须运行barrier.wait()才能继续前进。
import time
from selenium import webdriver
from threading import Thread, Barrier
def func(barrier):
driver = webdriver.Chrome()
#driver.set_window_size(920, 680)
driver.get(url)
driver.find_element_by_id("email").send_keys("xx")
driver.find_element_by_id("pass").send_keys("yy")
b = driver.find_element_by_id("loginbutton")
print('wait for others')
barrier.wait()
print('click')
b.click()
# ---
url = 'https://www.facebook.com/'
number_of_threads = 5
barrier = Barrier(number_of_threads)
threads = []
for _ in range(number_of_threads):
t = Thread(target=func, args=(barrier,))
t.start()
threads.append(t)
for t in threads:
t.join()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3837 次 |
| 最近记录: |