目的
通过web端页面功能实现并发开播、看播,对媒体、信令服务进行压测
实现顺序
- 同时启多个浏览器,多线程实现多webdriver
for i in range(2):
_thread.start_new_thread(self.test_selenium, ())
- 一个浏览器启动其他tab
- 本质:就是再开启另一个窗口tab
js = 'window.open("https://www.baidu.com/");'
self.driver.execute_script(js)
- 同时启动多个tab页面,一个webdriver
class Live(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver_path = "/usr/local/bin/chromedriver"
cls.driver = webdriver.Chrome(cls.driver_path)
cls.url = "https://www.baidu.com//"
cls.driver.get(cls.url)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
def test1():
pass
def test2():
pass
…………
def change_tab(self):
js = 'window.open("https://XXXXX/Web_Demo/videocall/dist/");'
self.driver.execute_script(js)
time.sleep(2)
def for_test_watch(self):
for i in range(5):
_thread.start_new_thread(self.change_tab,())
hands = self.driver.window_handles
- 启动多个tab后,进行tab切换:获取句柄列表,进行句柄切换
def for_test_watch(self):
for i in range(5):
_thread.start_new_thread(self.change_tab,())
hands = self.driver.window_handles
print(len(hands))
time.sleep(1)
for j in hands:
self.driver.switch_to.window(j)
self.watch_live()
- 获取系统弹窗
-
警告类弹窗 alert()
显示警告或其他信息,用于通知用户,一般下方只有一个按钮(确认或OK) -
确认类弹窗confirm()
询问是否继续某种操作等功能,弹窗中有【确认】和【取消】两种按钮。 -
消息类弹窗prompt()
需要输入一些信息,比如用户密码等,会有【确认】和【取消】按扭
- 解决:{“method”:“css selector”,“selector”:".list-frame"},例子:google设置页修改权限元素获取不到?!
- 本质是shadow-root(open)DOM中的元素获取不到
chrome://settings/content/siteDetails?site=https%3A%2F%2Fqa-web.linkv.fun/
- 实例:通过JS的手段获取shadow中的元素
# 返回的对象在这里
def control_in_shadow(self, driver, js):
shadow = driver.execute_script(js)
return shadow
def setting(self):
time.sleep(2)
js1 = 'return document.querySelector("body > settings-ui").shadowRoot.querySelector("#main").shadowRoot.querySelector("settings-basic-page").shadowRoot.querySelector("#basicPage > settings-section.expanded > settings-privacy-page").shadowRoot.querySelector("#pages > settings-subpage > site-details").shadowRoot.querySelector("div.list-frame > site-details-permission:nth-child(2)").shadowRoot.querySelector("#permission")'
shadow = self.control_in_shadow(self.driver, js1)
shadow.find_elements("id", "allow").pop().click()
js2 = 'return document.querySelector("body > settings-ui").shadowRoot.querySelector("#main").shadowRoot.querySelector("settings-basic-page").shadowRoot.querySelector("#basicPage > settings-section.expanded > settings-privacy-page").shadowRoot.querySelector("#pages > settings-subpage > site-details").shadowRoot.querySelector("div.list-frame > site-details-permission:nth-child(3)").shadowRoot.querySelector("#permission")'
shadow = self.control_in_shadow(self.driver, js2)
shadow.find_elements("id", "allow").pop().click()
- 错误记录
TypeError: first arg must be callable
原因:_thread.start_new_thread(driver.execute_script(js),())
报错:selenium.common.exceptions.InvalidSessionIdException: Message: invalid session id
原因:selenium调用webdriver显示浏览器,关闭后又打开,提示 invalid session id 无效的 session id