Selenium 的使用

Posted on Wed, 25 Dec 2024 16:13:47 +0800 by LiangMingJian


概述

Selenium 是一个用于测试网站的自动化测试工具,支持各种浏览器,如 Chrome、Firefox、Edge 等,可使用以下命令进行安装。

pip install Selenium

环境配置

Selenium 的使用是基于浏览器驱动 webdriver 来启动与操作网页的,因此想要正常的进行 Selenium 自动化测试就必须获取对应浏览器的 webdriver 驱动文件。

可以在环境变量中配置 Path 的属性,令其指向放置 webdriver 驱动文件的文件夹,或在程序代码中指定 webdriver 驱动文件的位置。

chromedriver.exe --version
geckodriver.exe --version

元素的定位

|元素               | 定位一个元素                       | 含义                 
|-------------------| --------------------------------- | -----------------
|id                 | find_element_by_id                | 通过 id 定位
|name               | find_element_by_name              | 通过 name 定位    
|xpath              | find_element_by_xpath             | 通过 xpath 定位  
|link_texr          | find_element_by_link_text         | 通过完整超链接定位   
|partial_link_text  | find_element_by_partial_link_text | 通过部分链接定位
|tag_name           | find_element_by_tag_name          | 通过标签定位
|class_name         | find_element_by_class_name        | 通过类名进行定位
|css_selector       | find_elements_by_css_selector     | 通过 css 进行定位 

对象的定位是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。一个对象就像一个人一样,他会有各种的特征(属性),我们可以通过这个属性找到这对象。以百度搜索的输入框为例,有以下属性(F12 查看)。

<input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off"/>

我们可以这样来定位属性:

# 通过 id 方式定位
browser.find_element_by_id("kw")
# 通过 name 方式定位
browser.find_element_by_name("wd")
# 通过 tag name 方式定位
browser.find_element_by_tag_name("input")
# 通过 class name 方式定位
browser.find_element_by_class_name("s_ipt")
# 通过 CSS 方式定位
browser.find_element_by_css_selector("#kw")
browser.find_element_by_css_selector("html > body > form > span > input")
# 通过 xpath 方式定位
browser.find_element_by_xpath("//input[@id='kw']")
browser.find_element_by_xpath("/html/body/form/span/input")

复数元素的定位,只要在 find_element 后面加上 s 便可,此时返回的是元素的列表。

elements = driver.find_elements_by_xpath('//div/h3/a')

浏览器的基本操控

| 方法                | 说明                  
| ------------------- | ----------------------
| set_window_size()   | 设置浏览器的大小       
| back()              | 控制浏览器后退         
| forward()           | 控制浏览器前进         
| refresh()           | 刷新当前页面           
| clear()             | 清除文本               
| send_keys (value)   | 模拟按键输入           
| click()             | 单击元素               
| submit()            | 用于提交表单           
| get_attribute(name) | 获取元素属性值         
| is_displayed()      | 设置该元素是否用户可见 
| size                | 返回元素的尺寸         
| text                | 获取元素的文本         

使用举例:

from selenium import webdriver
# 1.创建浏览器对象
browser = webdriver.Edge(executable_path ="D:\GeckoDriver\edgedriver_win64\msedgedriver")
# 2.通过浏览器向服务器发送URL请求
browser.get("https://www.baidu.com/")
# 3.刷新浏览器
browser.refresh()
# 4.设置浏览器的大小
browser.set_window_size(1400,800)
# 5.设置链接内容
element=browser.find_element_by_link_text("新闻")
element.click()

鼠标的模拟操作

| 方法                   | 说明    
| ---------------------- | -------------------------
| ActionChains(driver)   | 构造 ActionChains 对象 
| context_click()        | 右击    
| move_to_element(above) | 执行鼠标悬停操作 
| double_click()         | 双击        
| drag_and_drop()        | 拖动     
| move_to_element(above) | 执行鼠标悬停操作   
| context_click()        | 用于模拟鼠标右键操作, 在调用时需要指定元素定位 
| perform()              | 执行所有 ActionChains 中存储的行为, 可以理解成是对整个操作的提交动作 

使用举例:

from selenium import webdriver
# 1.引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Edge(executable_path ="D:\GeckoDriver\edgedriver_win64\msedgedriver")
driver.get("https://www.baidu.com")
# 2.定位到要悬停的元素
element= driver.find_element_by_link_text("设置")
# 3.对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(element).perform()
# 4.寻找链接
elem1=driver.find_element_by_link_text("搜索设置")
elem1.click()

键盘的模拟操作

| 模拟键盘按键               | 说明                
| -------------------------- | ------------------- 
| send_keys(Keys.BACK_SPACE) | 删除键(BackSpace) 
| send_keys(Keys.SPACE)      | 空格键(Space)       
| send_keys(Keys.TAB)        | 制表键(Tab)         
| send_keys(Keys.ESCAPE)     | 回退键(Esc)       
| send_keys(Keys.ENTER)      | 回车键(Enter)     
| send_keys(Keys.CONTROL,'a') | 全选(Ctrl+A) 
| send_keys(Keys.CONTROL,'c') | 复制(Ctrl+C) 
| send_keys(Keys.CONTROL,'x') | 剪切(Ctrl+X) 
| send_keys(Keys.CONTROL,'y') | 粘贴(Ctrl+V) 
| send_keys(Keys.F1…Fn)       | 键盘(F1…Fn)     

使用举例:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Edge(executable_path ="D:\GeckoDriver\edgedriver_win64\msedgedriver")
browser.get("https://www.baidu.com")
elem=browser.find_element_by_id("kw")
elem.send_keys('Selenium')
elem.send_keys(Keys.ENTER)

断言

我们可以采用以下属性作为断言参考。

| 属性        | 说明                   
| ----------- | ----------------------
| title       | 用于获得当前页面的标题 
| current_url | 用户获得当前页面的 URL  
| text        | 获取搜索条目的文本信息 

表单的切换

| 方法                        | 说明 
| --------------------------- | --------------------
| switch_to.frame()           | 将当前定位的主体切换为 frame/iframe 表单的内嵌页面中
| switch_to.default_content() | 跳回最外层的页面                               

窗口的切换

| 方法                  | 说明 
| --------------------- | ----------------------
| current_window_handle | 获得当前窗口句柄     
| window_handles        | 返回所有窗口的句柄到当前会话   
| switch_to.window()    | 用于切换到相应的窗口

警告框的处理

| 方法                  | 说明                                               
| --------------------- | ------------------------------
| text                  | 返回 alert/confirm/prompt 中的文字信息             
| accept()              | 接受现有警告框                                     
| dismiss()             | 解散现有警告框                                     
| send_keys()           | 发送文本至警告框 
| switch_to_alert       | 切换到 alert

下拉框的选择

from selenium.webdriver.support.select import Select
| 方法                              | 说明                      
| ---------------------------------| ------------------------- 
| select_by_value("选择值")         | select 标签的 value 属性的值 
| select_by_index("索引值")         | 下拉框的索引              
| select_by_visible_testx("文本值") | 下拉框的文本值           

cookie 的操作

| 方法                              | 说明  
| --------------------------------- | -----------------
| get_cookies()                     | 获得所有 cookie 信息 
| get_cookie(name)                  | 返回字典的 key 为 “name” 的 cookie 信息
| add_cookie(cookie_dict)           | 添加 cookie,“cookie_dict” 指字典对象,必须有 name 和 value 值 
| delete_cookie(name,optionsString) | 删除 cookie 信息,“name” 是要删除的 cookie 的名称,“optionsString” 是该 cookie 的选项
| delete_all_cookies()              | 删除所有 cookie 信息 

窗口截图

| 方法                                   | 说明                               
| -------------------------------------- | -----------
| get_screenshot_as_file(self, filename) | 用于截取当前窗口, 并把图片保存到本地 

关闭浏览器

| 方法    | 说明         
| ------- | ------------ 
| close() | 关闭单个窗口 
| quit()  | 关闭所有窗口 

获取网站源码

| 方法    | 说明         
| ------- | ------------ 
| page_source | 获取网站源码