0


python Web自动化之Selenium的基本使用

1.selenium介绍

  • 概述 Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
  • 优势- 开源软件:源代码开放,可根据需要来增加工具的某些功能;- 跨平台:linux、windows、mac;- 多语言:支持Java、Python、C#、JavaScript、Ruby等。
  • WebDriver API支持的开发语言- Java- Python- PHP- JavaScript- Perl- Ruby- C#
  • Selenium WebDriver原理

#mermaid-svg-m6CK7sIcPuRNxAA2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .error-icon{fill:#552222;}#mermaid-svg-m6CK7sIcPuRNxAA2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-m6CK7sIcPuRNxAA2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .marker.cross{stroke:#333333;}#mermaid-svg-m6CK7sIcPuRNxAA2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .cluster-label text{fill:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .cluster-label span{color:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .label text,#mermaid-svg-m6CK7sIcPuRNxAA2 span{fill:#333;color:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .node rect,#mermaid-svg-m6CK7sIcPuRNxAA2 .node circle,#mermaid-svg-m6CK7sIcPuRNxAA2 .node ellipse,#mermaid-svg-m6CK7sIcPuRNxAA2 .node polygon,#mermaid-svg-m6CK7sIcPuRNxAA2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .node .label{text-align:center;}#mermaid-svg-m6CK7sIcPuRNxAA2 .node.clickable{cursor:pointer;}#mermaid-svg-m6CK7sIcPuRNxAA2 .arrowheadPath{fill:#333333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-m6CK7sIcPuRNxAA2 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-m6CK7sIcPuRNxAA2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-m6CK7sIcPuRNxAA2 .cluster text{fill:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 .cluster span{color:#333;}#mermaid-svg-m6CK7sIcPuRNxAA2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-m6CK7sIcPuRNxAA2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
Request

Response

      脚本
     

      Browser Drivers
     

      Browsers
     
  • Selenium Client Library - Selenium自动化测试人员可以使用Java、Ruby、Python、C#等语言,利用它们提供的库来编写脚本。
  • JSON Wire Protocol Over HTTP Client - JSON Wire Protocol是在HTTP服务器之间传输信息的REST风格的API。每个浏览器驱动程序(如FirefoxDriver、ChromeDriver等)都有它们各自的HTTP服务器。
  • Browser Drivers - 不同的浏览器都包含一个单独的浏览器驱动程序。浏览器驱动程序与相应的浏览器通信。当浏览器驱动程序接收到指令后,将在相应的浏览器中执行,相应信息以HTTP的形式返回。
  • Browsers - Selenium支持多种浏览器,如Firefox、Chrome、IE、Safari、Opera、Edge等。

2.环境搭建–Selenium及相关软件安装配置

3.selenium的基本使用

3.1 入门案例

from selenium import webdriver
from time import sleep

# 1.创建WebDriver对象# 如果将驱动添加到了系统环境变量目录中,可不带参数# driver = webdriver.Chrome()# 如果没有添加到系统环境变量目录中,需要通过参数指定from selenium.webdriver.chrome.service import Service

# DeprecationWarning: executable_path has been deprecated, please pass in a Service object# https://www.likecs.com/ask-1641032.html
service = Service(r"D:\software\chromedriver.exe")
driver = webdriver.Chrome(service=service)# 2.url请求地址
url ='https://www.baidu.com'# 使用浏览器打开指定页面# 3.发送请求
driver.get(url)# 4.睡眠3秒
sleep(3)# 5.关闭驱动对象
driver.close()

在这里插入图片描述

3.2 元素查找

可通过webDriver的By方法获取元素。

from selenium.webdriver.common.by import By

# def find_element(self, by=By.ID, value=None)# def find_elements(self, by=By.ID, value=None)

支持参数包含:

  • ID
  • CLASS_NAME
  • NAME
  • TAG_NAME
  • CSS_SELECTOR
  • XPATH
  • LINK_TEXT
  • PARTIAL_LINK_TEXT在这里插入图片描述

对于一段html

<inputtype="text"class="s_ipt"name="wd"id="kw"maxlength="100"autocomplete="off">

如下代码可以获取到这个标签:

# 通过id定位元素
  driver.find_element(by=By.ID, value='kw')# 通过name定位元素
  driver.find_element(by=By.NAME, value='wd')# 通过class_name定位元素
  driver.find_element(by=By.CLASS_NAME, value='s_ipt')# 通过tag_name标签名定位元素
  driver.find_element(by=By.TAG_NAME, value='input')
  • 示例
from selenium import webdriver
  from time import sleep
  from selenium.webdriver.chrome.service import Service
  from selenium.webdriver.common.by import By
  
  # 1.创建WebDriver对象
  service = Service(r"D:\software\chromedriver.exe")
  driver = webdriver.Chrome(service=service)# 2.url请求地址
  url ='https://www.baidu.com'# 3.发送请求
  driver.get(url)# <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off"># 通过id定位元素,send_keys()在输入框中输入内容
  driver.find_element(by=By.ID, value='kw').send_keys('python')# 通过name定位元素# driver.find_element(by=By.NAME, value='wd')# 通过class_name定位元素# driver.find_element(by=By.CLASS_NAME, value='s_ipt')# 通过tag_name标签名定位元素# driver.find_element(by=By.TAG_NAME, value='input')# <input type="submit" id="su" value="百度一下" class="bg s_btn"># 通过id定位元素,click方法进行点击操作
  driver.find_element(by=By.ID, value='su').click()# 4.睡眠3秒
  sleep(3)# 5.关闭驱动对象
  driver.close()
  • 超链接(a标签)- link_text- partial_link_text- 如果使用相同的规则匹配到多个标签,这些方法只返回第一个匹配到的标签

对于一段html

<ahref="http://news.baidu.com"target="_blank"class="mnav c-font-normal c-color-t">新闻</a>

如下代码都可以访问到这个标签

# 精确查找-->完整关键字查找-->通过link_text定位元素
  driver.find_element(by=By.LINK_TEXT, value='新闻').click()# 模糊查找-->部分关键字查找-->通过partial_link_text定位元素
  driver.find_element(by=By.PARTIAL_LINK_TEXT, value='新').click()
  • 示例
from selenium import webdriver
  from time import sleep
  from selenium.webdriver.chrome.service import Service
  from selenium.webdriver.common.by import By
  
  # 1.创建WebDriver对象
  service = Service(r"D:\software\chromedriver.exe")
  driver = webdriver.Chrome(service=service)# 2.url请求地址
  url ='https://www.baidu.com'# 使用浏览器打开指定页面# 3.发送请求
  driver.get(url)# <a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a># 精确查找-->完整关键字查找-->通过link_text定位元素,click方法进行点击操作
  driver.find_element(by=By.LINK_TEXT, value='新闻').click()# 模糊查找-->部分关键字查找-->通过partial_link_text定位元素
  driver.find_element(by=By.PARTIAL_LINK_TEXT, value='新').click()# 4.睡眠3秒
  sleep(3)# 5.关闭驱动对象
  driver.close()
  • css选择器语法
    选择器示例描述class.intro选择class=“intro”的所有元素#id#firstname选择id=“firstname”的所有元素**选择所有元素elementp选择所有

    元素element,elementdiv,p选择所有

    元素和

    元素element elementdiv p选择所有

    元素内部的全部

    元素element>elementdiv>p选择父元素为

    元素的所有

    元素element+elementdiv+p选择紧接在

    元素之后的所有

    元素[attribute][target]选择带有target属性的所有元素[attribute=value][target=_blank]选择target=“_blank”的所有元素
    css选择器参考手册:https://www.w3school.com.cn/cssref/css_selectors.asp

对于一段html

<inputid="username_id"type="text"name="username"class="red">

如下代码都可以获取到这个标签

# id选择器
  driver.find_element(by=By.CSS_SELECTOR, value='#username_id')# 属性选择器
  driver.find_element(by=By.CSS_SELECTOR, value='[name=username]')# 类选择器
  driver.find_element(by=By.CSS_SELECTOR, value='.red')# 标签选择器
  driver.find_element(by=By.CSS_SELECTOR, value='input')
  • 示例
from selenium import webdriver
  from time import sleep
  from selenium.webdriver.chrome.service import Service
  from selenium.webdriver.common.by import By
  
  # 1.创建WebDriver对象
  service = Service(r"D:\software\chromedriver.exe")
  driver = webdriver.Chrome(service=service)# 2.url请求地址
  url ='https://www.baidu.com'# 3.发送请求
  driver.get(url)# <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off"># id选择器
  el1 = driver.find_element(by=By.CSS_SELECTOR, value='#kw')print(el1)# 属性选择器
  el2 = driver.find_element(by=By.CSS_SELECTOR, value='[name=wd]')print(el2)# 类选择器
  el3 = driver.find_element(by=By.CSS_SELECTOR, value='.s_ipt')print(el3)# 标签选择器
  el4 = driver.find_element(by=By.CSS_SELECTOR, value='input')print(el4)# 4.睡眠3秒
  sleep(3)# 5.关闭驱动对象
  driver.close()
  • xpath概念 xpath(XML Path Language),即XML路径语言,可用来在XML文档中对元素和属性进行遍历。XML和HTML一样,是标记语言,通过标签的嵌套来表达信息。多重嵌套,形成了父节点、子节点等关系,xpath就是用来在这些节点中找到需要的数据。通过Chrome的调试工具(F12打开),可获得特定的xpath(Elements–>选中元素–>右键–>Copy–>Copy XPath)。
  • xpath表达式- 选取节点表达式描述nodename选取此节点的所有子节点。/从根节点选取。//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。.选取当前节点。…选取当前节点的父节点。@选取属性。- 示例路径表达式结果bookstore选取 bookstore 元素的所有子节点。/bookstore选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!bookstore/book选取属于 bookstore 的子元素的所有 book 元素。//book选取所有 book 子元素,而不管它们在文档中的位置。bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。//@lang选取名为 lang 的所有属性。- 获取内容表达式描述@选取属性text()获取文本内容参考:https://www.w3school.com.cn/xpath/xpath_syntax.asp
from selenium import webdriver
  from time import sleep
  from selenium.webdriver.chrome.service import Service
  from selenium.webdriver.common.by import By
  
  # 1.创建WebDriver对象# 如果将驱动添加到了系统环境变量目录中,可不带参数# driver = webdriver.Chrome()# 如果没有添加到系统环境变量目录中,需要通过参数指定
  
  service = Service(r"D:\software\chromedriver.exe")
  driver = webdriver.Chrome(service=service)# 2.url请求地址
  url ='https://www.baidu.com'# 3.发送请求
  driver.get(url)
  driver.find_element(by=By.XPATH, value='//*[@id="kw"]').send_keys('李白')
  driver.find_element(by=By.XPATH, value='//*[@id="su"]').click()# 4.睡眠
  sleep(5)# 5.关闭驱动对象
  driver.close()

3.3 元素的其他操作

  • 元素操作 - clear():清除文本- send_keys():模拟输入- click():单击元素
  • 获取属性元素 - size:返回元素大小- text:获取元素文本内容- get_attribute():获取属性值- is_display():判断元素是否可见- is_enabled():判断元素是否可用
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 1.创建WebDriver对象
service = Service(r"D:\software\chromedriver.exe")
driver = webdriver.Chrome(service=service)# 2.url请求地址
url ='https://www.baidu.com'# 3.发送请求
driver.get(url)
el1 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]')
el1.send_keys('疾风剑豪')
sleep(2)# 清除文本
el1.clear()# driver.find_element(by=By.XPATH, value='//*[@id="su"]').click()# 获取元素尺寸大小print(el1.size)# 获取文本内容print(el1.text)# 获取属性值print(el1.get_attribute('class'))# 查看是否可用(是否可点击)print(el1.is_enabled())# 查看元素是否显示print(el1.is_displayed())# 查看元素是否选中print(el1.is_selected())# 4.睡眠
sleep(5)# 5.关闭驱动对象
driver.close()

3.4 浏览器的基本操作

  • 浏览器操作方法 - maximize_window():窗口最大化- set_window_size(width, height):设置窗口宽高(单位为像素)- set_window_position(x,y):设置窗口位置,浏览器窗口左上角相对于屏幕左上角的位置- back():后退- forward():前进- refresh():刷新页面- close():关闭当前页面- quit():关闭浏览器
  • 浏览器信息(属性) - title:获取页面标题- current_url:获取当前页面的url地址

3.5 页面等待

3.5.1 显式等待
  • 操作步骤 - 1.使用WebDriverWait包装webDriver对象- 2.使用webDriverWait的util方法,传入可调用对象(一般是presence_of_element_locate函数的返回值)- 每隔一段时间不断尝试查找元素,找到了就返回。如果超过指定时间还没找到就报错。
  • 示例:
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

# 1.创建WebDriver对象
service = Service(r"D:\software\chromedriver.exe")
driver = webdriver.Chrome(service=service)# 2.url请求地址
url ='https://hanyu.baidu.com/shici/detail?pid=3bae8ab343d84e359bea52e48db609d2&from=kg0'# 3.发送请求
driver.get(url)# 显式等待
el1 = WebDriverWait(driver,3).until(EC.presence_of_element_located((By.ID,'poem-detail-header')))print(el1)# 4.睡眠
time.sleep(5)# 5.关闭驱动对象
driver.close()
3.5.2 隐式等待
  • 操作步骤 在创建好webDriver对象之后,调用implicitly_wait()方法传入超时时间即可
  • 原理 - 元素在第一次就定位到则不会触发隐式等待时长。- 如果定位某一元素失败,就会触发隐式等待有效时长。- 如果在指定时间内加载完毕,则继续执行。否则,抛出NoSuchElementException异常。
  • 示例
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 1.创建WebDriver对象
service = Service(r"D:\software\chromedriver.exe")
driver = webdriver.Chrome(service=service)# 隐式等待
driver.implicitly_wait(5)# 2.url请求地址
url ='https://hanyu.baidu.com/shici/detail?pid=3bae8ab343d84e359bea52e48db609d2&from=kg0'# 3.发送请求
driver.get(url)
el1 = driver.find_element(By.ID,'poem-detail-header')print(el1)# 4.睡眠
time.sleep(5)# 5.关闭驱动对象
driver.close()

3.6 鼠标操作

selenium可以模拟鼠标操作

  • 操作步骤- 创建ActionChains对象- 使用ActionChains对象的方法,进行操作 - context_click():右击,模拟鼠标右击效果- double_click():双击,模拟鼠标双击- drag_and_drop():拖动,模拟鼠标拖动- move_to_element():悬停,模拟鼠标悬停效果- 其他:参考ActionChains源码- 通过ActionChains提交这些操作:perform()执行
  • 示例- 拖动
from selenium import webdriver
  from time import sleep
  from selenium.webdriver import ActionChains
  from selenium.webdriver.chrome.service import Service
  from selenium.webdriver.common.by import By
  
  # 1.创建WebDriver对象
  
  service = Service(r"D:\software\chromedriver.exe")
  driver = webdriver.Chrome(service=service)# 2.url请求地址
  url ='https://www.baidu.com'# 3.发送请求
  driver.get(url)
  driver.maximize_window()
  sleep(1)
  el1 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]')# 创建一个事件链对象
  chains = ActionChains(driver)
  
  el2 = driver.find_element(by=By.XPATH, value='//*[@id="form"]/span[1]')
  
  chains.drag_and_drop(el2, el1)# 事件提交
  chains.perform()# 4.睡眠3秒
  sleep(3)# 5.关闭驱动对象
  driver.close()
  • 移动鼠标
import time
  from selenium import webdriver
  from selenium.webdriver import ActionChains
  from selenium.webdriver.chrome.service import Service
  from selenium.webdriver.common.by import By
  
  # 1.创建WebDriver对象
  
  service = Service(r"D:\software\chromedriver.exe")
  driver = webdriver.Chrome(service=service)# 2.url请求地址
  url ='https://www.baidu.com'# 3.发送请求
  driver.get(url)
  driver.maximize_window()
  time.sleep(1)# 创建一个事件链对象
  chains = ActionChains(driver)
  
  el1 = driver.find_element(by=By.XPATH, value='//*[@id="s-top-left"]/div/a')
  
  chains.move_to_element(el1)# 事件提交
  chains.perform()# 4.睡眠3秒
  time.sleep(3)# 5.关闭驱动对象
  driver.close()
  driver.quit()

3.7 键盘操作

  • 方法 element_send_keys()
  • 参数 - 普通字符串- 键盘按键
  • 示例
"""
要求
    1.输入文本:将进酒李白,暂停3秒,删除“李白”
    2.全选文本:将进酒
    3.剪切:将进酒,暂停3秒
    4.粘贴到输入框,点击搜索
"""import time

from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 1.创建WebDriver对象
service = Service(r"D:\software\chromedriver.exe")
driver = webdriver.Chrome(service=service)# 2.url请求地址
url ='https://www.baidu.com'# 3.发送请求
driver.get(url)# 定位输入框
el1 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]')# 输入文本
el1.send_keys('将进酒李白')
time.sleep(3)# 删除“李白”
el1.send_keys(Keys.BACK_SPACE*2)# 全选
el1.send_keys(Keys.CONTROL,'a')# 剪切
el1.send_keys(Keys.CONTROL,'x')
time.sleep(3)# 复制# el1.send_keys(Keys.CONTROL, 'c')# 粘贴
el1.send_keys(Keys.CONTROL,'v')# 点击搜索
driver.find_element(by=By.XPATH, value='//*[@id="su"]').click()# 4.睡眠
time.sleep(5)# 5.关闭驱动对象
driver.close()

3.8 页面滚动

WebDriver类库中提供了可调用JavaScript脚本的方法,可以通过JavaScript脚本来达到操作滚动条的目的。

  • 方法 - 让浏览器执行js代码:driver.execute_script(js代码字符串)- 滚动的js代码 - 绝对滚动:window.scrollTo(x,y)- 相对滚动:window.scrollBy(x,y)
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# 1.创建WebDriver对象
service = Service(r"D:\software\chromedriver.exe")
driver = webdriver.Chrome(service=service)# 2.url请求地址
url ='https://www.baidu.com'# 3.发送请求
driver.get(url)
driver.maximize_window()
time.sleep(2)# 绝对滚动
js_str ="window.scrollTo(1920,1080)"
driver.execute_script(js_str)# 4.睡眠
time.sleep(5)# 5.关闭驱动对象
driver.close()

参考文章:


本文转载自: https://blog.csdn.net/username666/article/details/126236901
版权归原作者 梦里逆天 所有, 如有侵权,请联系我们删除。

“python Web自动化之Selenium的基本使用”的评论:

还没有评论