selenium 能用多线程进行开多标签页进行自动化测试吗?

2022-10-21 10:53:33 +08:00
 tmzg0000

我想用 selenium 多任务测试,不想开多个浏览器,只想在一个浏览器里面多标签操作。我参照网上的代码写了如下的。可是多窗口总是不行,二个关键字都输入到一个标签了。有人帮忙看看吗?


from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from concurrent.futures.thread import ThreadPoolExecutor

url = 'https://www.baidu.com/'
keys = ['java', 'python', 'go']

def openwin(url):
    newwindow = f'window.open("{url}")'
    browser.execute_script(newwindow)
    browser.switch_to.window(browser.window_handles[-1])
    handle = browser.current_window_handle
    sleep(2)
    print(handle)
    return handle
    
def outer(keyword):
    def browser_work(res):
        handle=res.result()
        print(handle)
        if browser.current_window_handle != handle:
            browser.switch_to.window(handle)  # 移动句柄,对新打开页面进行操作
        print('browser is  working...')
        el_location = browser.find_element(By.XPATH, '//*[@id="kw"]')
        el_location.clear()
        el_location.send_keys(keyword)
        el_location = browser.find_element(By.XPATH, '//*[@id="su"]')
        el_location.click()
        sleep(3)
        browser.close()
        browser.switch_to.window(browser.window_handles[0])
    return browser_work

ts=[]

options = Options()
options.add_argument("--no-sandbox")
options.add_argument('--disable-gpu')
options.add_argument('window-size=1920x1080')
browser = webdriver.Chrome(options=options)
browser.get("https://bing.com/")

POOL = ThreadPoolExecutor(2)
for i in keys:
    futrue = POOL.submit(openwin,url)
    futrue.add_done_callback(outer(i))
2047 次点击
所在节点    Python
6 条回复
theohateonion
2022-10-21 11:04:52 +08:00
doyel
2022-10-21 11:09:40 +08:00
用 headless 去请求吧
brucmao
2022-10-21 12:25:45 +08:00
ClericPy
2022-10-21 20:38:33 +08:00
chrome 原生 CDP 做过不同标签页并行执行不同命令, selenium 还真不清楚它这 send_keys 是 dispatch Event 还是走驱动模拟点击...

PS: 多 tab 当心那个同域名连接约束, 反正我之前超过 6 个 Tab 时候第七个就一直等待连接, 最后用多个浏览器上下文解决的
tmzg0000
2022-10-22 15:09:32 +08:00
@doyel 请教如何用 headless 去请求?
jshmysq
2022-10-27 13:29:06 +08:00
这种方式不行的,会打架
看看 grid

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/888653

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX