高效 Selenium 测试技巧:轻松控制已开启

在日常做 Selenium 测试的时候,总是遇到网页需要登录的情况,上次我们在做 Selenium 专题的时候,有讲过一个自动刷 B 站的案例,里面涉及到了登录的情况,详细推文点击  这里  ,很多同学也提出了疑问,是否可以通过执行当前我设置好并登录好的网页去进行测试?那么我们今天就一起来探讨一些,如何连接已经打开的浏览器,并进行自动化测试。

二、控制现有浏览器的步骤解析

我们这边以 Chrome 浏览器为例,我们这里采用的是 Chrome DevTools 协议,他们为客户提供了检查和调试 Chrome 浏览器的便利功能。
具体步骤如下:
1、在控制台内打开 Chrome 浏览器的文件夹
2、在命令行中输入命令:


   
   
  
from selenium  import webdriver
from selenium.webdriver.chrome.options  import Options
chrome_options = Options()
chrome_options.add_experimental_option( "debuggerAddress" "127.0.0.1:9222")
driver = webdriver.Chrome(chrome_options=chrome_options)
     

做完这一步之后,就可以直接在已打开的浏览器上执行脚本或编写脚本啦。
注意:
1、该浏览器不小心关闭后,需要再次执行第二个步骤重新打开 Chrome 浏览器噢。一般登录状态也会随之保留的。
2、Airtest-selenium 切换新网页作用域时,使用  driver.switch_to_new_tab()  会出现报错:  'WebDriver' object has no attribute 'switch_to_window'  ,只需要将切换新网页作用域语句改为:  driver.switch_to.window(driver.window_handles[-1])  即可。

三、代码案例

通过上述所讲的接管已开启浏览器的方式,我们将之前刷 B 站的代码重新修改一下,去掉了登录并存储 cookie 的方法,直接通过连接我们已打开登录好账号的 b 浏览器,执行一系列的刷 B 站操作,如搜索、点击播放、发送弹幕等。
参考代码:


   
   
  
引入selenium 模块和其他必要的库
from airtest.core.api  import *
from airtest_selenium.proxy  import WebChrome
from selenium.webdriver.common.keys  import Keys
from selenium.webdriver.common.by  import By
from selenium.webdriver.support.ui  import WebDriverWait
from selenium.webdriver.support  import expected_conditions  as EC
from selenium.webdriver.chrome.options  import Options
from selenium  import webdriver
import threading
import time
import random
import json

# 选项,连接到已打开的Chrome 连接到已打开的Chrome 打开chrome 输入搜索关键词并提交搜索
    search_box = driver.find_element(By.CLASS_NAME, 'nav-search-input')
    search_box.send_keys( 'Airtest 切换界面
    sleep( 3)

     # 酱”主页
    driver.find_element(By.XPATH, "//*[@id=\"i_cecream\"]/div/div[2]/div[2]/div/div/div/div[2]/div/div/div/div/div/div/h2/a").click()
    
     # 查找特定视频元素
    video_ele = driver.find_element(By.XPATH, "//div[@title='14 自动化测试小白课程 ']")

     # 获取所有视频列表
    video_list = driver.find_elements(By.XPATH, "//ul[@class='row video-list clearfix']//a[@class='title']")

     # 切换到新打开的视频页面
    driver.switch_to.window(driver.window_handles[ - 1])

     # 随机播放一个视频
    driver.switch_to.window(driver.window_handles[ - 1])   # 暂停播放
def  video_pause_and_play(check_btn= False):
    
     try:
         # 暂停按钮
        paus_btn = driver.find_elements(By.XPATH,
             "//*[@id=\"bilibili-player\"]//div[@class='bpx-player-ctrl-btn bpx-player-ctrl-play']")
         if paus_btn[ 0]:
             # 时间戳检测是否在播放
            detection_time2 = driver.find_elements(By.XPATH,
                 '//*[@class="bpx-player-control-bottom-left"]//div[@class="bpx-player-ctrl-time-label"]')
            end_time = detection_time2[ 0].text
            
             # True 暂停按钮
             if start_time == end_time  or check_btn:
                 print( " 暂停 )<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 按钮 ")
                paus_btn[ 0].click()
     except Exception  as e:
         print( f " 暂停 )<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 出错 {e} ")

#<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";">发送弹幕
def  video_sms(sms_body= "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 不错 "):
     try:
         # 输入弹幕内容并发送
        sms_input_edit.send_keys(sms_body)
        sms_input_edit.send_keys(Keys.ENTER)
     except Exception  as e:
         print( f "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 发弹幕出错 {e} ")
     print( f "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 发送弹幕: {sms_body} ")

# <1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";">点赞视频
def  video_love():
    
     print( "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 点赞 ")
     try:
         # <1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";">查找点赞按钮
        sms_input_edit = driver.find_elements(By.XPATH,
             "//div[@class='toolbar-left-item-wrap']//div[@class='video-like video-toolbar-left-item']")
         if  not sms_input_edit:
             print( "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 已经点赞 ")
             return
         # <1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";">点击点赞按钮
        sms_input_edit[ 0].click()
     except Exception  as e:
         print( f "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 点赞出错 {e} ")

# <1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";">收藏视频
def  video_collect():

     print( "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 收藏 ")
     try:
         # <1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";">查找收藏按钮
        colle_btn = driver.find_elements(By.XPATH,
             "//div[@class='toolbar-left-item-wrap']//div[@class='video-fav video-toolbar-left-item']")
         if  not colle_btn:
             print( "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 已经收藏 ")
             return
         # 获取收藏夹列表
        list_coll = driver.find_elements(By.XPATH, "//div[@class='group-list']//ul/li/label")

         # 滚动到选中的收藏夹元素位置
        random_element = random.choice(list_coll)   # 滚动到指定元素处
        driver.execute_script( "arguments[0].scrollIntoView(true);", random_element)
        sleep( 2)
        random_element.click()   # 点击确认收藏按钮
        driver.find_element(By.XPATH, "//div/button[@class='btn submit-move']").click()
        
     except Exception  as e:
         print( f "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 收藏出错 {e} ")

def  wait_for_element(driver, selector, timeout= 60 *  5):
     try:
         # 等待元素出现
        element = WebDriverWait(driver, timeout).until(
            EC.presence_of_element_located((By.XPATH, selector))
        )
     except Exception:
         print( "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 元素未出现 ")
         return  None

# 启动浏览器并打开视频
    start_selenium()

     # <1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";">等待元素出现
    element = wait_for_element(driver, selem)
     if element:
         print( "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 检测到已经登录 ")

         # 刷新页面
        driver.refresh()

         # <1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";">发送多条随机弹幕
        sms_list = [ "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 感觉不错,收藏了 " "666,<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 这么强 " "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 自动化还得看 airtest" "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 干货呀 " "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 麦克阿瑟直呼内行 "]
         for item  in sms_list:
            wait_time = random.randint( 5 10)   #
            time.sleep(wait_time)
            video_sms(item)   # 点赞和收藏视频
         for action  in [video_love, video_collect]:
            action()
            sleep( 3)
     else:
         print( "<1span ,="" 微软雅黑,="" simsun,="" sans-serif;"="" style="box-sizing: inherit; font-family: "Microsoft YaHei";"> 登录超时 ")


请使用浏览器的分享功能分享到微信等