selenium
一、WEB自动化简介
适合做自动化的项目:(1)软件需求变更不频繁(2)项目周期比较长(3)自动化的脚本能够重复利用。
自动化测试入项:系统测试
自动化测试实现过程:可行性分析,框架的选择(selenium,RF),需求分析、计划、测试用例的设计,无人值守、提交报告。
二、selenium的原理与安装
2.1 selenium简介
Selenium是一套Web网站的程序自动化的解决方案。通过它我们可以写出自动化程序,像人在浏览器中操作web页面一样。比如点击页面按钮,在文本框中输入文字等操作。而且还能从web页面获取信息。比如获取火车、汽车票务信息,招聘网站职位岗位,财经网站股票价格信息等,然后用程序进行分析处理。
Selenium的自动化原理:
2.2 自动化环境安装
安装selenium
Selenium客户端安装命令行:
pip install selenium
如果安装不了可以执行清华大学的源
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
安装chromedriver
google源
http://chromedriver.storage.googleapis.com/index.html
Chrome浏览器
安装Chrome浏览器驱动的网址
https://googlechromelabs.github.io/chrome-for-testing/
选择114 win64版本与浏览器版本适配的webdriver
https://registry.npmmirror.com/binary.html?path=chrome-for-testing/
看浏览器的版本
选择大版本相同的驱动进行下载
下载后解压
2.3 简单示例
写selenium程序查看chromedriver驱动启动
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
wd=webdriver.Chrome(service=Service(r"C:\Users\Downloads\chromedriver_win32\chromedriver.exe"))
input()
运行程序
可以看到服务中已经启动了chromedriver驱动
Selenium简单示例,用chrome浏览器打开https://www.baidu.com
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
wd=webdriver.Chrome(service=Service(r"C:\Users\Downloads\chromedriver_win32\chromedriver.exe"))
wd.get('https://www.baidu.com')
input()
关闭chromedriver日志
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
options=webdriver.ChromeOptions()
options.add_experimental_option(
'excludeSwitches',['enable-logging']
)
wd=webdriver.Chrome(options=options,service=Service(r"C:\Users\Downloads\chromedriver_win32\chromedriver.exe"))
wd.get('https://www.baidu.com')
input()
三、选择元素的基本方法
对于百度搜索页面,如果我们想自动化输入柏悦黑羽,就是在网页中,操控界面元素。Web界面自动化,要操纵元素,首先需要选择界面元素,或者说定位界面元素。就是先告诉浏览器,你要操作哪个界面元素,让它找到你要操作的界面元素。我们必须要先让浏览器先找到元素,然后才能操作元素。
3.1 根据ID属性选择元素
我们可以把id想象成元素的编号,是用来在html中标记元素的。根据规范,如果元素有id属性,这个id必须是当前html中唯一的。所以,如果元素有id,这个id必须是当前html中唯一的,所以如果元素有id,根据id选择元素是最简单高效的方式。
访问百度,并搜索通讯相关消息
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome()
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
#根据id选择元素,返回的就是该元素对应的webElement对象。
element=wd.find_element(By.ID,'kw')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
element.send_keys("通讯\n")
pass
这里返回的是一个WebElement对象
如果根据传入的ID,找不到这样的元素,find_element方法就会抛出selenium.common.exceptions.NoSuchElementException异常。
更改程序传入一个不存在的id
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome()
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
#根据id选择元素,返回的就是该元素对应的webElement对象。
element=wd.find_element(By.ID,'kw1')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
element.send_keys("通讯\n")
pass
使用点击搜索
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome()
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
#根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.ID,'kw')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
element1.send_keys("通讯\n")
element2=wd.find_element(By.ID,'su')
element2.click()
wd.quit()
3.2 根据class属性、tag名选择元素
根据class属性选择元素
Web自动化的难点和重点之一,就是如何选择我们想要操作的web页面元素。除了根据元素的id,我们还可以根据元素的class属性选择元素。
如果想选择指定class属性的元素可以使用find_elements
新建项目
新建1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
</body>
</html>
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
#根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CLASS_NAME,'plant')
elements2=wd.find_elements(By.CLASS_NAME,'animal')
# elements1=wd.find_elements_class_name('plant')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
for elements in elements1:
print(elements.text)
for elements in elements2:
print(elements.text)
pass
输出结果:
如果通过class name获取单个webElement对象
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
#根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_element(By.CLASS_NAME,'plant')
elements2=wd.find_element(By.CLASS_NAME,'animal')
# elements1=wd.find_elements_class_name('plant')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
print(elements1.text)
print(elements2.text)
pass
输出结果:
find_element和find_elements的区别
使用find_elements选择的是符合条件的所有元素,如果没有符合条件的元素,返回空列表
使用find_element选择的是符合条件的第一个元素,如果没有符合条件的元素,抛出异常。
查找没有符合条件的元素
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
#根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_element(By.CLASS_NAME,'plant1')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
print(elements1.text)
pass
会产生如下错误:
根据tag名选择元素
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
#根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.TAG_NAME,'div')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
for elements in elements1:
print(elements.text)
pass
运行结果如下:
3.3 通过WebElement对象选择元素
不仅WebDriver对象有选择元素的方法,WebElement对象也有选择元素的方法。WebElement对象也可以调用find_elements_by_xxx、find_element_by_xxx之类的方法。
WebDriver对象选择元素范围是整个Web页面,而WebElement对象选择的范围是该元素的内部。
1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
<div id="layer1">
<div id="inner11"><span>内层11</span></div>
<div id="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div id="inner21"><span>内层21</span></div>
<div id="inner22"><span>内层22</span></div>
</div>
</div>
</body>
</html>
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
#根据id选择元素,返回的就是该元素对应的webElement对象。
element=wd.find_element(By.ID,'container')
# 限制 选择元素的范围是id 为container 内部的内容
spans=element.find_elements(By.TAG_NAME,"span")
# 比如输入字符串
for span in spans:
print(span.text)
pass
3.4 等待元素出现
当发现元素没有找到的时候,并不立即返回元素找不到的错误。而是周期性的(每隔半秒钟)重新寻找该元素,直到元素被找到,或者超出指定最大等待时长,这才抛出异常(如果是find_elements之类的方法,则是返回空列表)。
Selenium的Webdriver对象中有个方法叫做implicitly_wait,该方法接收一个参数,用来指定最大等待时长。加入后后续的所有find_element或者find_elements之类的方法调用都会采用上面的策略。如果找不到元素每隔半秒再去界面上查看一次,直到找到了该元素,或者过了10S最大时长。
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element=wd.find_element(By.ID,'container')
# 限制 选择元素的范围是id 为container 内部的内容
spans=element.find_elements(By.TAG_NAME,"span")
# 比如输入字符串
for span in spans:
print(span.text)
pass
四、操控元素的基本方法
选择到元素之后,我们的代码会返回元素对应的WebElement对象,通过这个对象,我们就可以操控元素。
操控元素通常包括:
1、 点击元素
2、 在元素中输入字符串,通常是对输入框这样的元素
3、 获取元素包含的信息,比如文本内容,元素的属性
4.1 点击元素
点击元素非常简单,就是调用元素WebElement对象的click方法。当我们调用WebElement对象的click方法去点击元素的时候,浏览器接收到自动化命令,点击的是该元素的中心点位置。
输入框
输入字符串也非常简单,就是调用WebElement对象的send_keys方法。
如果我们要把输入框已经有的内容清除掉,可以使用WebElement对象的clear方法
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.ID,'kw')
element2=wd.find_element(By.ID,'su')
# 先清除搜索框内容,然后输入海贼王
element1.clear()
element1.send_keys("海贼王")
element2.click()
pass
4.2 获取元素信息
获取元素的文本内容,通过WebElement对象的text属性,可以获取元素展示在界面上的文本内容。
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CLASS_NAME,'animal')
# 获取文本内容
print(element1.text)
pass
运行结果如下:
4.3 获取元素属性
通过WebElement对象的get_attribute方法来获取元素的属性值。比如要获取元素属性class的值,就可以使用element.get_attribute("class")
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.ID,'kw')
# 获取属性值
print(element1.get_attribute("maxlength"))
pass
运行结果如下:
执行完自动化代码,如果想要关闭浏览器窗口可以调用WebDriver对象的quit方法。
wd.quit()
4.4 获取元素对应的HTML
要获取整个元素对应的HTML文本内容,可以使用element.get_attribute(“outerHTML”)
如果只是想获取某个元素内部的HTML文本内容,可以使用element.get_attribute(“innerHTML”)
获取整段的HTML代码,使用outerHTML
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.ID,'kw')
# 获取属性值
print(element1.get_attribute("outerHTML"))
wd.quit()
pass
运行结果:
获取内部HTML,使用innerHTML
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CLASS_NAME,'s_btn_wr')
# 获取属性值
print(element1.get_attribute("innerHTML"))
wd.quit()
pass
运行结果:
4.5 获取输入框中的内容
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.ID,'kw')
element1.send_keys("海贼王")
# 获取属性值
print(element1.get_attribute("value"))
wd.quit()
pass
输出结果:
通过WebElement对象的text属性,可以获取元素展示在界面上的文本内容。但是有时候,元素的文本内容没有展示在界面上,或者没有完全展示在界面上。这时,用WebElement对象的text属性获取文本内容会有问题。出现这种情况,可以尝试使用element.get_attribute(‘innerText’)或者element.get_attribute(‘textContent’)
五、CSS选择器
如果我们选择的元素没有id、class属性,或者我们不想选择的元素也有相同的id、class属性值,我们通常可以使用CSS selector语法选择元素。HTML中经常为某种元素指定显示效果,CSS必须告诉浏览器,要选择哪些元素,来使用这样的显示风格。CSS selector语法就是用来选择元素的。
通过CSS Selector选择单个元素的方法是
find_element_by_css_selector(CSS Selector参数)
选择所有元素的方法是
find_elements_by_css_selector(CSS Selector参数)
1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.animal{color: red}
</style>
</head>
<body>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
<div id="layer1">
<div id="inner11"><span>内层11</span></div>
<div id="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div id="inner21"><span>内层21</span></div>
<div id="inner22"><span>内层22</span></div>
</div>
</div>
</body>
</html>
selenium_test1.p
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,".animal")
# 获取文本内容
print(element1.get_attribute("innerHTML"))
pass
输出结果如下:
5.1 根据tag名、id、class选择元素
CSS Selector同样可以根据tag名、id属性、class属性来选择元素。根据tag名选择元素的CSS Selector语法非常简单,直接写上tag名即可。
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"span")
# 获取文本内容
print(element1.get_attribute("innerHTML"))
pass
输出结果:
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(3)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_elements(By.CSS_SELECTOR,"span")
# 获取文本内容
for element in element1:
print(element.get_attribute("innerHTML"))
pass
运行结果:
根据id属性选择元素的语法是在id号前面加上一个#号
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(3)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#container")
# 获取文本内容
print(element1.get_attribute("innerHTML"))
pass
运行结果:
5.2 选择子元素和后代元素
HTML中,元素内部可以包含其他元素,比如下面的HTML片段
<div id="container">
<div id="layer1">
<div id="inner11"><span>内层11</span></div>
<div id="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div id="inner21"><span>内层21</span></div>
<div id="inner22"><span>内层22</span></div>
</div>
</div>
后代元素也包括了直接子元素,比如id为layer1和layer2的两个div元素,也可以说是id为container的div元素的直接子元素,同时也是后代子元素。
如果元素2是元素1的直接子元素,CSS Selector选择子元素的语法是这样的:
元素1 > 元素2
中间使用>号,最终选择的元素是元素2,并且要求这个元素2是元素1的直接子元素
也支持更多层级的选择
元素1>元素2>元素3>元素4
就是选择元素1里面的子元素元素2里面的子元素元素3里面的子元素元素4
如果元素2是元素1的后代元素,CSS Selector选择后代元素的语法是这样的:
元素1 元素2
最终选择的元素是元素2,并且要求这个元素2是元素1的后代元素。
也支持更多的层级的选择
元素1 元素2 元素3 元素4
最终选择的元素是元素4
1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#container>div {color: red}
</style>
</head>
<body>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
<div id="layer1">
<div id="inner11"><span>内层11</span></div>
<div id="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div id="inner21"><span>内层21</span></div>
<div id="inner22"><span>内层22</span></div>
</div>
</div>
</body>
</html>
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(3)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#container>div")
# 获取文本内容
print(element1.get_attribute("innerHTML"))
pass
运行结果:
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(3)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#container div")
# 获取文本内容
print(element1.get_attribute("innerHTML"))
pass
运行结果:
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#container>span")
# 获取文本内容
print(element1.get_attribute('outerHTML'))
wd.quit()
运行结果:由于span不是container的直接子元素,所以找不到span
更改Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#container span")
# 获取文本内容
print(element1.get_attribute('outerHTML'))
wd.quit()
运行结果:
这时候可以找到它的后代元素。
5.3 根据属性选择
CSS选择器支持通过任何属性来选择元素,语法是用一个方括号[]。比如需要选择<a href=”https://www.baidu.com”>百度</a>里面根据href选择,可以使用[href=”https://www.baidu.com”]。这个表达式的意思是,选择属性href值为https://www.baidu.com的元素。
1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#container>div {color: red}
</style>
</head>
<body>
<a href="https://www.baidu.com">baidu</a>
</body>
</html>
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_element(By.CSS_SELECTOR,"[href='https://www.baidu.com']")
# 获取文本内容
print(elements1.get_attribute('innerHTML'))
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements2=wd.find_elements(By.CSS_SELECTOR,"div[class='animal']")
# 获取文本内容
for element2 in elements2:
print(element2.get_attribute('innerHTML'))
wd.quit()
运行结果:
5.4 选择语法联合使用
1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#container>div {color: red}
</style>
</head>
<body>
<a href="https://www.baidu.com">baidu</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
<div id="layer1">
<div class="inner11"><span>内层11</span></div>
<div class="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div class="inner21"><span>内层21</span></div>
<div class="inner22"><span>内层22</span></div>
</div>
</div>
</body>
</html>
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"div > #layer1 .inner11")
# 获取文本内容
print(element1.get_attribute('innerHTML'))
wd.quit()
如果想同时选择属性不同的多个不同元素,可以用,连接不同的属性值
1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#container>div {color: red}
</style>
</head>
<body>
<a href="https://www.baidu.com">baidu</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
<div id="layer1">
<div class="inner11"><span>内层11</span></div>
<div class="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div class="inner21"><span>内层21</span></div>
<div class="inner22"><span>内层22</span></div>
</div>
</div>
</body>
</html>
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,".plant,.animal")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
运行结果如下:
5.5 选择语法组选择
1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="t1">
<h3>唐诗</h3>
<span>李白</span>
<p>静夜思</p>
<span>杜甫</span>
<p>春夜喜雨</p>
</div>
</body>
</html>
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#t1 p,#t1 span")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
运行结果为:
5.6 按次序选择子节点
按次序选择子节点,父元素的第n个子节点。我们可以指定选择的元素是父元素的第几个子节点,使用nth-child
span:nth-child(2)
1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="t1">
<h3>唐诗</h3>
<span>李白</span>
<p>静夜思</p>
<span>杜甫</span>
<p>春夜喜雨</p>
</div>
<div id="t2">
<h3>宋词</h3>
<span>苏轼</span>
<p>赤壁怀古</p>
<p>明月几时有</p>
<p>江城子.乙卯正月二十夜记梦</p>
</div>
</body>
</html>
我们要选择唐诗宋词的第一个作者,也就是第二个子元素。
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"span:nth-child(2)")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
运行结果为:
父节点的倒数第n个子节点。也可以反过来,选择的是父元素的倒数第几个子节点,使用nth-last-child
p:nth-last-child(1)
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"p:nth-last-child(1)")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
输出结果如下:
父元素的第几个某类型的子节点。我们可以指定选择的元素是父元素的第几个某类型的子节点,使用nth-of-type。
比如,我们要选择唐诗和宋词的第一个作者,可以选择的是第2个子元素,并且是span类型。
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"span:nth-of-type(1)")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
运行结果:
5.7 奇数节点和偶数节点
如果要选择的是父元素的奇数节点,使用nth-child(odd)
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#t1 :nth-child(odd)")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
输出结果:
如果要选择的是父元素的偶数节点,使用nth-child(even)
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#t1 :nth-child(even)")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
输出结果:
输出指定类型的奇数节点
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#t1 p:nth-of-type(even)")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
输出结果:
5.8 兄弟节点选择语法
相邻兄弟节点选择。选择唐诗和宋词的第一个作者可以选择h3后面紧跟的兄弟节点span,这就是一种相邻兄弟关系,可以这样写h3+span,表示元素紧跟关系的是加号
h3+span
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"h3+span")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
输出结果:
如果选择h3后面所有的兄弟节点,使用~
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"h3~span")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
运行结果:
如果指定某个div
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#t1 h3~span")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
运行结果:
六、Frame 切换/窗口切换
6.1 frame切换
如果使用iframe元素,在其中一个html文档中包含另外的html文档,就得使用Frame切换。这个iframe元素很特殊,在html语法中,frame元素或者iframe元素的内容部会包含一个被嵌入的另一份html文档。
在我们使用selenium打开一个网页是我们的操作范围缺省是当前的html,并不包含嵌入的html文件的内容。如果我们要操作被嵌入的html文档中的元素,就必须切换操作方位到被嵌入的文档中。使用WebDriver对象的switch_to属性。
wd.switch_to.frame(frame_reference)
1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="t1">
<h3>唐诗</h3>
<span>李白</span>
<p>静夜思</p>
<span>杜甫</span>
<p>春夜喜雨</p>
</div>
<div id="t2">
<h3>宋词</h3>
<span>苏轼</span>
<p>赤壁怀古</p>
<p>明月几时有</p>
<p>江城子.乙卯正月二十夜记梦</p>
</div>
<iframe src="2.html" id="frame1" name="innerFrame">
</iframe>
</body>
</html>
2.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#container>div {color: red}
</style>
</head>
<body>
<a href="https://www.baidu.com">baidu</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
<div id="layer1">
<div class="inner11"><span>内层11</span></div>
<div class="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div class="inner21"><span>内层21</span></div>
<div class="inner22"><span>内层22</span></div>
</div>
</div>
</body>
</html>
其中,frame_reference可以是frame元素的属性name或者ID
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
wd.switch_to.frame("frame1")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#container")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
运行结果:
也可以填写frame所对应的WebElement对象。我们可以根据frame的元素位置或者属性特性,使用find系列的方法,选择到该元素,得到对应的WebElement对象。
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
wd.switch_to.frame(wd.find_element(By.CSS_SELECTOR,'[src="2.html"]'))
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#container")
# elements1=wd.find_elements(By.CSS_SELECTOR,".plant")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.quit()
运行结果:
如果已经切入了内部的iframe框架,想要切回原来的html中,可以通过如下代码:
wd.switch_to.default_content()
selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
wd.switch_to.frame(wd.find_element(By.CSS_SELECTOR,'[src="2.html"]'))
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#container")
# elements1=wd.find_elements(By.CSS_SELECTOR,".plant")
# 获取文本内容
for element1 in elements1:
print(element1.get_attribute('innerHTML'))
wd.switch_to.default_content()
element2=wd.find_element(By.CSS_SELECTOR,"#t1")
print(element2.text)
wd.quit()
运行结果:
6.2 切换到新的窗口
在网页上操作的时候,我们经常遇到,点击一个链接或者按钮,就会打开一个新窗口。如果我们要到新窗口操作,可以使用Webdriver对象的switch_to属性的window方法
wd.switch_to.window(handle)
参数handle需要传入什么参数,WebDriver对象有window_handles属性,这是一个列表对象,里面包括了当前浏览器里面所有的窗口句柄。句柄就是对应网页窗口的一个ID。
Selenium_test1.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(30)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"[href='https://www.baidu.com']")
element1.click()
for handle in wd.window_handles:
wd.switch_to.window(handle)
if '百度' in wd.title:
wd.find_element(By.ID,"kw").send_keys('截拳道')
element2=wd.find_element(By.ID,'su')
element2.click()
break
wd.quit()
上面代码的用意就是,依次获取wd.window_handles里面的所有句柄对象,并且调用wd.switch_to.window(handle)方法,切入到每个窗口。然后检查里面该窗口对象的属性(可以是标题栏、地址栏),判断是不是我们要操作的那个窗口,如果是,就跳出循环。
如果我们在新窗口操作结束后,还要回到原来的窗口,我们仍然可以使用上面的方法,依次切入窗口,然后根据标题栏之类的属性进行判断。
或者
因为我们一开始就在原来的窗口里面,我们知道进入新窗口操作完后,还需要再切回来,可以事先保存该老窗口的句柄,使用下面的方法
#mainWindow变量保存当前窗口的句柄
mainWindow=wd.current_window_handle
切换到新窗口操作完后,可以直接将driver对应的对象返回原来的窗口
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
mainWindow=wd.current_window_handle
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"[href='https://www.baidu.com']")
element1.click()
time.sleep(3)
for handle in wd.window_handles:
wd.switch_to.window(handle)
time.sleep(3)
if '百度' in wd.title:
break
wd.find_element(By.ID,"kw").send_keys('截拳道')
time.sleep(3)
wd.switch_to.window(mainWindow)
time.sleep(3)
wd.find_element(By.ID,'clickme').click()
七、输入框和选择框
选择框
radio框
radio框,直接使用WebElement的click方法,模拟用户点击就可以了。
3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择框</title>
</head>
<body>
<div id="s_radio">
<input type="radio" name="teacher" value="小江老师">小江老师
<br>
<input type="radio" name="teacher" value="小雷老师">小雷老师
<br>
<input type="radio" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
</body>
</html>
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#s_radio input[checked=checked]")
print("当前选中的是:"+element1.get_attribute('value'))
time.sleep(10)
element2=wd.find_element(By.CSS_SELECTOR,"#s_radio input[value='小雷老师']")
element2.click()
time.sleep(10)
print("当前选中的是:"+element2.get_attribute('value'))
checkbox框
对checkbox进行选择,也是直接用WebElement的click方法,模拟用户点击选择。需要注意的是,要选中checkbox的一个选项,必须先获取当前该复选框的状态,如果该选项已经勾选了,就不能够点击,否则反而会取消选择。先把已经选中的选项全部点击一下,确保都是未选择状态。再选择需要选择的。
3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择框</title>
</head>
<body>
<div id="s_checkbox">
<input type="checkbox" name="teacher" value="小江老师">小江老师
<br>
<input type="checkbox" name="teacher" value="小雷老师">小雷老师
<br>
<input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
</body>
</html>
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#s_checkbox input[checked=checked]")
time.sleep(10)
for element1 in elements1:
element1.click()
time.sleep(10)
element2=wd.find_element(By.CSS_SELECTOR,"#s_checkbox input[value='小雷老师']")
element2.click()
time.sleep(10)
print("当前选中的是:"+element2.get_attribute('value'))
select框
radio框以及checkbox框都是input元素,只是里面的type不同而已。select框则是一个新的select标签,对于select选择框,selenium专门提供了一个select类进行操作。
Select类提供了如下的方法
根据选择的value属性值,选择元素。
select_by_value
根据选项的次序(从1开始),选择元素
select_by_index
根据选项的可见文本,选择元素
select_by_visible_text
根据选项的value属性值,去除选中元素
deselect_by_value
根据选择的次序,去除选中元素
deselect_by_index
根据选项的可见文本,去除选中元素
deselect_by_visible_text
Select单选框
3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择框</title>
</head>
<body>
<select id="ss_single">
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
<select id="ss_multi" multiple>
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
</body>
</html>
对于select单选框,操作比较简单,不管原来选择的是什么,直接用Select方法选择即可。
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
select1=Select(wd.find_element(By.ID,"ss_single"))
time.sleep(10)
select1.select_by_visible_text("小雷老师")
time.sleep(10)
Select多选框
对于select多选框,要选中某几个选项,要注意去掉原来已经选中的选项。
例如,我们选择示例多选框中的小雷老师和小凯老师。可以用select类的deselect_all方法,清除所有已经选中的选项。然后再通过select_by_visible_text方法选择小雷老师和小凯老师。
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
select1=Select(wd.find_element(By.ID,"ss_multi"))
time.sleep(10)
select1.deselect_all()
select1.select_by_visible_text("小雷老师")
select1.select_by_visible_text("小凯老师")
time.sleep(10)
八、Xpath选择器
Xpath语法简介
Xpath是由国际标准化组织W3C指定的,用来在XML和HTML文档中选择节点的语言。
目前主流浏览器(chrome、firefox、edge、safari)都支持Xpath语法,xpath有1和2两个版本,目前浏览器支持的是xpath1的语法。
Xpath语法中,整个HTML文档根节点用“/”表示,如果我们想选择的是根节点下面的html节点,则可以在搜索框中输入
/html
如果输入下面的表达式
/html/body/div
这个表达式表示选择html下面的body下面的div元素
自动化程序要使用Xpath来选择web元素,应该调用WebDriver对象的方法find_element_by_xpath或者find_elements_by_xpath
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
select1=Select(wd.find_element(By.XPATH,"//select[@id='ss_multi']"))
time.sleep(10)
select1.deselect_all()
select1.select_by_visible_text("小雷老师")
select1.select_by_visible_text("小凯老师")
time.sleep(10)
绝对路径选择
如果Xpath路径以正斜杠(/)开始,就表示从根节点开始。从根节点开始的路径表达式,就是某元素的绝对路径。/html/body/div等价于css表达式html>body>div。
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"/html/body/div")
for element1 in elements1:
print(element1.text)
time.sleep(10)
运行结果:
相对路径选择
有时候,我们需要选择web中某一类型的所有web元素,不管它在什么位置。比如,选择页面的所有标签名为div的元素,如果使用CSS表达式,直接写一个div就行了。
在xpath中需要前面加//,表示从当前节点往下寻找所有的后代元素,不管它在什么位置。所以xpath表达式,应该这样写//div
//符号也可以继续加在后面,比如,要选择所有的div元素里面的所有的P元素,不管div在什么位置,也不管p元素在div下面的什么位置,则可以这样写//div//p
对应的自动化程序如下:
elements1=wd.find_elements(By.XPATH,"//div//p")
//表示后代元素,/表示直接子节点
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//body//div//p")
for element1 in elements1:
print(element1.text)
time.sleep(10)
运行结果:
如果相匹配某标签的所有后代标签,使用*号
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//body//div[@id='t2']//*")
for element1 in elements1:
print(element1.text)
time.sleep(10)
运行结果:
根据属性选择
Xpath可以根据属性来选择元素。根据属性来选择元素是通过这种格式来的[@属性名='属性值'],注意(1)属性名注意前面有个@(2)属性值一定要用引号,可以是单引号,也可以是双引号
根据id属性选择
选择id为west的元素可以这样
//*[@id='west']
3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择框</title>
</head>
<body>
<a href="https://www.baidu.com">百度</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
<div id="layer1">
<div class="inner11"><span>内层11</span></div>
<div class="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div class="inner21"><span>内层21</span></div>
<div class="inner22"><span>内层22</span></div>
</div>
</div>
<button id="clickme"></button>
<div id="t1">
<h3>唐诗</h3>
<span>李白</span>
<p>静夜思</p>
<span>杜甫</span>
<p>春夜喜雨</p>
</div>
<div id="t2">
<h3>宋词</h3>
<span>苏轼</span>
<p>赤壁怀古</p>
<p>明月几时有</p>
<p>江城子.乙卯正月二十夜记梦</p>
</div>
<div id="s_radio">
<input type="radio" name="teacher" value="小江老师">小江老师
<br>
<input type="radio" name="teacher" value="小雷老师">小雷老师
<br>
<input type="radio" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
<div id="s_checkbox">
<input type="checkbox" name="teacher" value="小江老师">小江老师
<br>
<input type="checkbox" name="teacher" value="小雷老师">小雷老师
<br>
<input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
<select id="ss_single">
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
<select id="ss_multi" multiple>
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
<div>
<p style="color:brown;font-weight: bold">
城市选择
</p>
<div id="china">
<p id="beijing" class="capital huge-city">
北京
</p>
<p id="shanghai" class="huge-city">
上海
</p>
</div>
<div id="us">
<span id="west" style="color: darkgreen">
<p id="newyork">
纽约
</p>
<p id="huston">
休斯顿
</p>
</span>
</div>
</div>
</body>
</html>
Selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//div[@id='us']")
for element1 in elements1:
print(element1.text)
time.sleep(10)
运行结果:
Selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//*[@id='us']")
for element1 in elements1:
print(element1.text)
time.sleep(10)
运行结果:
Selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//*[@id]")
for element1 in elements1:
print(element1.text)
time.sleep(10)
运行结果如下:这样会选择所有带有id属性的元素
根据class属性选择
选择所有div元素中class为single_choice的元素,可以这样写
//div[@class='single_choice']
3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择框</title>
</head>
<body>
<a href="https://www.baidu.com">百度</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
<div id="layer1">
<div class="inner11"><span>内层11</span></div>
<div class="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div class="inner21"><span>内层21</span></div>
<div class="inner22"><span>内层22</span></div>
</div>
</div>
<button id="clickme"></button>
<div id="t1">
<h3>唐诗</h3>
<span>李白</span>
<p>静夜思</p>
<span>杜甫</span>
<p>春夜喜雨</p>
</div>
<div id="t2">
<h3>宋词</h3>
<span>苏轼</span>
<p>赤壁怀古</p>
<p>明月几时有</p>
<p>江城子.乙卯正月二十夜记梦</p>
</div>
<div id="s_radio">
<input type="radio" name="teacher" value="小江老师" class="single_choice">小江老师
<br>
<input type="radio" name="teacher" value="小雷老师" class="single_choice">小雷老师
<br>
<input type="radio" name="teacher" value="小凯老师" checked="checked" class="single_choice">小凯老师
</div>
<div id="s_checkbox">
<input type="checkbox" name="teacher" value="小江老师">小江老师
<br>
<input type="checkbox" name="teacher" value="小雷老师">小雷老师
<br>
<input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
<select id="ss_single">
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
<select id="ss_multi" multiple>
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
<div>
<p style="color:brown;font-weight: bold">
城市选择
</p>
<div id="china">
<p id="beijing" class="capital huge-city">
北京
</p>
<p id="shanghai" class="huge-city">
上海
</p>
</div>
<div id="us">
<span id="west" style="color: darkgreen">
<p id="newyork">
纽约
</p>
<p id="huston">
休斯顿
</p>
</span>
</div>
</div>
</body>
</html>
Selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,'//input[@class="single_choice"]')
for element1 in elements1:
print(element1.get_attribute('value'))
time.sleep(5)
运行结果:
如果一个元素class有多个,如果要选择它,需要写全属性,不可以只写一个属性
Selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,'//p[@class="capital huge-city"]')
for element1 in elements1:
print(element1.get_attribute('id'))
time.sleep(5)
运行结果:
@后可以直接加属性值
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,'//select[@multiple]')
for element1 in elements1:
print(element1.get_attribute('id'))
time.sleep(5)
运行结果:
CSS选择器选择属性值包含某个字符串的元素
3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择框</title>
</head>
<body>
<a href="https://www.baidu.com">百度</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
<div id="layer1">
<div class="inner11"><span>内层11</span></div>
<div class="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div class="inner21"><span>内层21</span></div>
<div class="inner22"><span>内层22</span></div>
</div>
</div>
<button id="clickme"></button>
<div id="t1">
<h3>唐诗</h3>
<span>李白</span>
<p>静夜思</p>
<span>杜甫</span>
<p>春夜喜雨</p>
</div>
<div id="t2">
<h3>宋词</h3>
<span>苏轼</span>
<p>赤壁怀古</p>
<p>明月几时有</p>
<p>江城子.乙卯正月二十夜记梦</p>
</div>
<div id="s_radio">
<input type="radio" class="single_choice" name="teacher" value="小江老师"/>小江老师
<input type="radio" class="single_choice" name="teacher" value="小雷老师"/>小雷老师
<input type="radio" class="single_choice" name="teacher" value="小凯老师" checked="checked"/>小凯老师
</div>
<div id="s_checkbox">
<input type="checkbox" name="teacher" value="小江老师">小江老师
<input type="checkbox" name="teacher" value="小雷老师">小雷老师
<input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
<select class="multi-choice" id="ss_single">
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
<select id="ss_multi" multiple>
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
<div>
<p style="color:brown;font-weight: bold">
城市选择
</p>
<div id="china">
<p id="beijing" class="capital huge-city">
北京
</p>
<p id="shanghai" class="huge-city">
上海
</p>
</div>
<div id="us">
<span id="west" style="color: darkgreen">
<p id="newyork">
纽约
</p>
<p id="huston">
休斯顿
</p>
</span>
</div>
</div>
</body>
</html>
比如,要选择a节点,里面的href属性包含了baidu字符串,就可以这样写
Selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,'a[href*=baidu]')
for element1 in elements1:
print(element1.get_attribute('href'))
time.sleep(5)
运行结果:
还可以选择属性值以某个字符串开头的元素。比如,要选择a节点,里面的href属性以http开头,就可以这样写
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,'a[href^="http"]')
for element1 in elements1:
print(element1.get_attribute('href'))
time.sleep(5)
还可以选择属性值以某个字符串结尾的元素
属性值包含字符串
3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择框</title>
</head>
<body>
<a href="https://www.baidu.com">百度</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
<div id="layer1">
<div class="inner11"><span>内层11</span></div>
<div class="inner12"><span>内层12</span></div>
</div>
<div id="layer2">
<div class="inner21"><span>内层21</span></div>
<div class="inner22"><span>内层22</span></div>
</div>
</div>
<button id="clickme"></button>
<div id="t1">
<h3>唐诗</h3>
<span>李白</span>
<p>静夜思</p>
<span>杜甫</span>
<p>春夜喜雨</p>
</div>
<div id="t2">
<h3>宋词</h3>
<span>苏轼</span>
<p>赤壁怀古</p>
<p>明月几时有</p>
<p>江城子.乙卯正月二十夜记梦</p>
</div>
<div id="s_radio">
<input type="radio" class="single_choice" name="teacher" value="小江老师"/>小江老师
<input type="radio" class="single_choice" name="teacher" value="小雷老师"/>小雷老师
<input type="radio" class="single_choice" name="teacher" value="小凯老师" checked="checked"/>小凯老师
</div>
<div id="s_checkbox">
<input type="checkbox" name="teacher" value="小江老师">小江老师
<input type="checkbox" name="teacher" value="小雷老师">小雷老师
<input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
<select class="multi-choice" id="ss_single">
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
<select id="ss_multi" multiple>
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
<div>
<p style="color:brown;font-weight: bold">
城市选择
</p>
<div id="china">
<p id="beijing" class="capital huge-city">
北京
</p>
<p id="shanghai" class="huge-city">
上海
</p>
</div>
<div id="us">
<span id="west" style="color: darkgreen">
<p id="newyork">
纽约
</p>
<p id="huston">
休斯顿
</p>
</span>
</div>
</div>
</body>
</html>
要选择style属性值包含color字符串的页面元素,可以这样
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//*[contains(@style, 'color')]")
for element1 in elements1:
print(element1.get_attribute('style'))
time.sleep(5)
运行结果:
要选择style属性值以color字符串开头的页面元素,可以这样
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//*[starts-with(@style, 'color')]")
for element1 in elements1:
print(element1.get_attribute('style'))
time.sleep(5)
运行结果:
要选择style属性值以color字符串结尾的页面元素,可以这样
//*[ends-with(@style, 'color')]
按次序选择
前面学习过的CSS表达式可以根据元素在父节点中的次序选择。
Xpath也可以根据次序选择元素。语法比CSS更简洁,直接在方括号中使用数字表示次序。
某类型第几个子元素。比如,要选择p类型第2个的子元素
//p[2]
注意,选择的是p类型的第2个的子元素,不是第2个子元素,并且是p类型。
再比如,要选取父元素为div中的p类型第2个子元素
//div/p[2]
第几个子元素
也可以选择第2个子元素,不管是什么类型,采用通配符,比如选择父元素为div的第2个子元素,不管是什么类型。
//div/*[2]
倒数第1个子元素
//p[last()]
倒数第2个子元素
//p[last()-1]
范围选择
Xpath还可以选择子元素的次序范围。比如,选择option类型的第1到2个子元素
//option[position()<=2]
或者
//option[position()<3]
//*[@class='multi-choice']/option[position()<3]
如果想表示后几个
//*[@class='multi-choice']/option[position()>=last()-2]
组选择和兄弟节点
组选择
CSS有组选择,可以同时使用多个表达式,多个表达式选择的结果都是要选择的元素。CSS组选择,表达式之间用逗号隔开。Xpath也有组选择,使用竖线隔开多个表达式。
比如,要选择所有的option元素和所有的h4元素,可以使用
//option | //h4
等同于CSS选择器
option,h4
再比如,要选择所有的class为single_choice和class为multi_choice的元素,可以使用
//*[@class='single_choice'] | //*[@class='multi_choice']
等同于CSS选择器
.single_choice,.multi_choice
选择父节点
Xpath可以选择父节点,这是CSS做不到的。
某个元素的父节点用/..表示。比如,要选择id为china的节点的父节点,可以这样写//*[@id=’china’]/..,还可以继续向上找上层父节点,比如//*[@id='china']/../../..
兄弟节点选择
相邻兄弟节点选择
Xpath也可以选择后续的兄弟节点,用这样的语法following-sibling::
比如要选择class为single_choice的元素的所有后续兄弟节点
//*[@class=’single_choice’]/following-sibling::*
等同于CSS选择器.single_choice~*
如果,要选择后续节点中的div节点,就应该这样写
//*[@class=’single_choice’]/following-sibling::div
Xpath还可以选择前面的兄弟节点,用这样preceding-sibling::
比如,要选择class为single_choice的元素的所有后续兄弟节点
//*[@class=’single_choice’]/preceding-sibling::*
而CSS选择器无法选择前面的兄弟节点。
Selenium实战技巧
更多动作,之前我们对web元素的操作主要是选择元素、然后点击元素或者输入字符串,还有其他操作,比如鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽等,这些操作可以通过Selenium提供的ActionChains类来实现。
模拟鼠标悬停在百度页面的更多上
Selenium_test1.py
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
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.implicitly_wait(3)
wd.get("https://www.baidu.com")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
ac=ActionChains(wd)
#鼠标移动到元素上
ac.move_to_element(
wd.find_element(By.CSS_SELECTOR,'[name=tj_briicon]')
).perform()
time.sleep(10)
运行结果如下:
冻结界面
有些网站上面的元素,我们的鼠标放在上面会弹出一些内容,比如百度首页的右上角,有个更多产品选项。
如果我们把鼠标放在上面,就会弹出下面的图标。如果我们要用selenium自动化点击图标,就需要F12查看这个元素的特征。
但是我们的鼠标从图标移开后,这个栏目就整个消失了,就没有办法查看对应的HTML。
可以在浏览器的Console中输入如下代码
setTimeout(function(){debugger},5000)
表示在5000ms后,执行debugger命令。执行该命令会使浏览器进入debug状态。Debug状态有个特性,页面被冻住,不管我们怎么点击页面都不会触发事件。
所以,我们可以在输入上面代码并回车执行后,立即鼠标方法页面右上角更多产品处。这个时候就会弹出图标
弹出对话框
有的时候,我们经常会在操作页面的时候,出现一些弹出的对话框。
对话框有三种类型,分别是Alert(警告信息)、Confirm(确认信息)和prompt(提示输入)
Alert
Alert弹出框,目的就是显示通知信息,只需要用户看完信息后,点击OK确定即可。
Name自动化时如何模拟用户点击OK按钮呢?
driver.switch_to.alert.accept()
如果程序想要获取弹出对话框中的信息内容,可以通过如下代码:
driver.switch_to.alert.text
4.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>对话框、确认框、提示框</title>
</head>
<script type="text/javascript">
function functionA(){
alert("一起学习selenium")
}
function functionB(){
confirm("你确定要和我一起学习selenium吗")
}
function functionC(){
prompt("输入你想学习的课程")
}
</script>
<body>
<input type="button" name="btn1" id="btn1" value="alert" onclick="functionA()">
<input type="button" name="btn2" id="btn2" value="confirm" onclick="functionB()">
<input type="button" name="btn3" id="btn3" value="prompt" onclick="functionC()">
</body>
</html>
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/4.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"input[name='btn1']")
element1.click()
time.sleep(5)
wd.switch_to.alert.accept()
time.sleep(5)
Confirm
Confirm弹出框,主要是让用户确认是否要进行某个操作。
比如:当管理员在网站上选择删除了某个账号时,就可能弹出confirm弹出框,要求确认是否确定要删除。
Confirm弹出框有两个选择供用户选择,分别是OK和Cancel,分别代表确定和取消操作。
那么,自动化的时候,代码怎么模拟用户点击OK或者Cancel按钮呢?
Selenium提供如下方法进行操作:
如果我们想点击OK按钮,还是用刚才的accept方法,如下:
driver.switch_to.alert.accpet()
如果我们想点击Cancel按钮,可以用dismiss方法,如下:
driver.switch_to.alert.dismiss()
4.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>对话框、确认框、提示框</title>
</head>
<script type="text/javascript">
function functionA(){
alert("一起学习selenium")
}
function functionB(){
confirm("你确定要和我一起学习selenium吗")
}
function functionC(){
prompt("输入你想学习的课程")
}
</script>
<body>
<input type="button" name="btn1" id="btn1" value="alert" onclick="functionA()">
<input type="button" name="btn2" id="btn2" value="confirm" onclick="functionB()">
<input type="button" name="btn3" id="btn3" value="prompt" onclick="functionC()">
</body>
</html>
selenium_test1.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/4.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"input[name='btn2']")
element1.click()
time.sleep(5)
wd.switch_to.alert.accept()
time.sleep(5)
element1.click()
time.sleep(5)
wd.switch_to.alert.dismiss()
time.sleep(5)
Prompt
出现Prompt弹出框是需要用户输入一些信息,提交上去。
比如:当管理员在网站上选择给某个账号延期时,就可能会弹出Prompt弹出框,要求输入延期多长时间。
可以调用如下方法
driver.switch_to.alert.send_keys()
selenium_test1.py
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/4.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"input[name='btn3']")
element1.click()
time.sleep(5)
wd.switch_to.alert.send_keys('selenium')
wd.switch_to.alert.accept()
time.sleep(5)
wd.quit()