Selenium Web Driver的基本运用
目录浏览器窗口的基本操作
浏览器导航操作
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
前进、后退、刷新
driver.back() # 后退
driver.forward() # 前进
driver.refresh() # 刷新
浏览器窗口操作
最小化、最大化、关闭窗口
driver.minimize_window() # 最小化窗口
driver.maximize_window() # 最大化窗口
driver.close() # 关闭窗口
区别quit()和close()
quit():也会结束driver这个实例,窗口也会关闭,后续不可以接着使用driver实例
close():窗口会关闭,driver实例不会关闭,后续还可以接着使用
调整窗口位置与大小
driver.set_window_position(100, 100) # 移动到指定位置
driver.set_window_size(1000, 1000) # 调整大小
driver.set_window_rect(100, 100, 1000, 1000) # 移动并调整
休眠
time.sleep(3) # 单位s
获取浏览器信息
获取标题、网址
driver.title # 获取标题
driver.current_url # 获取网址
获取位置、大小
driver.get_window_position() # 获取位置
driver.get_window_size() # 获取大小
driver.get_window_rect() # 获取位置和大小
返回的是字典,这样提取
print("获取位置对象:", driver.get_window_position())
print("获取位置坐标x值:", driver.get_window_position()["x"])
print("获取位置坐标y值:", driver.get_window_position()["y"])
获取位置对象: {'x': 9, 'y': 9}
获取位置坐标x值: 9
获取位置坐标y值: 9
查找页面元素
按id查找
找到第一个匹配的
driver.find_element_by_id("id属性值")
比如说找到了一个输入框,可以往里面填数据send_keys
searchTextBox = driver.find_element_by_id("kw")
searchTextBox.send_keys("Hello World")
按name查找
driver.find_element_b_name("name属性值")
按class查找
driver.find_element_by_class_name("class属性值")
id或者name常作为唯一标识,class则不会,故还得先判断是否重复
按链接文本查找
driver.find_element_by_link_text("链接的文本")
按链接文本模糊查找
多了一个partial
driver.find_element_by_partial_link_text("链接的一部分文本")
按标签类型查找
driver.find_element_by_tag_name("HTML标签名称")
按XPath查找
html节点的选取
driver.find_element_by_xpath("XPath表达式")
-
绝对路径、相对路径
driver.find_element_by_xpath("/html/body/div/div/div/div/div/form/span/input") # 绝对路径
driver.find_element_by_xpath("//span/input") # 相对路径 健壮性稍好
缺点:匹配的元素可能有多个
-
索引、属性
索引
driver.find_element_by_xpath("//span/input[1]") driver.find_element_by_xpath("//span/input[last()]")
属性
根据属性名称来取得期待值,与之前的id、name、class挂钩
driver.find_element_by_xpath("//input[@id='kw']") driver.find_element_by_xpath("//input[@name='wd']") driver.find_element_by_xpath("//input[@class='s_ipt']") driver.find_element_by_xpath("//*[@id='kw']") # 还可以使用通配符
-
基于轴定位
相邻关系查找,向前,向后
driver.find_element_by_xpath("//span[@class='soutu-btn']/following::input[1]") # 找到之后的第一个input元素 driver.find_element_by_xpath("//a[@id='quickdelete']/preceding::input[1]") # 找到之前的第一个input元素 driver.find_element_by_xpath("//input[@id='su']/parent::span/parent::form//input[@id='kd']") # 找到父级元素span,再找到父级元素form,再找到id为wd的input元素
-
基于函数或表达式定位
driver.find_element_by_xpath("//a[text()='hao123']") # 查找文本为hao123的元素 driver.find_element_by_xpath("//a[contains(@href, 'www.hao123.com')]") # 查找href属性包含www.hao123.com的a元素 driver.find_element_by_xpath("//a[contains(text(), 'ao12')]") # 查找文本包含ao12的a元素 driver.find_element_by_xpath("//a[starts-with(@href, 'https://www.hao')]") # 查找href属性以https://www.hao开始的a元素
逻辑表达式
driver.find_element_by_xpath("//a[@name=errorname' or 'text()='hao123']") # 查找name属性为errorname或者文本为hao123的元素 driver.find_element_by_xpath("//a[contains(@href, 'hao123' and text()='hao123']") # 查找href属性包含hao123并且文本等于hao123的元素
浏览器开发者工具F12中也可使用xpath表达式
$x("XPATH表达式")
按CSS选择器查找
driver.find_element_by_css_selector("CSS选择器")
-
层级关系定位
driver.find_element_buy_css_selector("html > body > div > div >div > div > div > form > span > input")
-
关键属性定位
driver.find_element_by_css_selector("#kw") # id为kw driver.find_element_by_css_selector(".s_ipt") # class为s_ipt driver.find_element_by_css_selector("[name=wd]") # name为wd
-
基于属性进行模糊定位
driver.find_element_by_css_selector("[href^='https://www.hao']") # href为https://www.hao开头的元素 driver.find_element_by_css_selector("[href$='123.com']") # href为123.com结尾的元素 driver.find_element_by_css_selector("[href*=hao123]") # href包含hao123的元素
-
组合式定位
driver.find_element_by_css_selector("span > input[class='s_ipt'][name='wd']") # 查找任意span下Class名称为s_ipt,name属性为wd的input元素
通过By对象按动态条件查找(喜欢用这个)
导入by对象
from selenium.webdriver.common.by import by
格式
driver.find_element(By.查找条件, "条件值")
例子
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(By.ID, "kw")
driver.find_element(By.NAME, "wd")
driver.find_element(By.CLASS_NAME, "s_ipt")
driver.find_element(By.LINK_TEXT, "地图")
driver.find_element(By.PARTIAL_LINK_TEXT, "地")
driver.find_element(By.TAG_NAME, "input")
driver.find_element(By.XPATH, "//input[@id='kw']")
driver.find_element(By.CSS_SELECTOR, "#kw")
查找元素集合
这里的elements有s噢
driver.find_elements_by_id("id属性值")
driver.find_elements_by_name("name属性值")
driver.find_elements_by_class_name("class属性值")
driver.find_elements_by_link_text("链接文本")
driver.find_elements_by_partial_link_text("链接的一部分文本")
driver.find_elements_by_tag_name("HTML标签名称")
driver.find_elements_by_xpath("XPath表达式")
driver.find_elements_by_css_selector("CSS选择器")
driver.find_elements(By.查找条件, "条件值")
例子
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
baiduLinks = driver.find_elements(By.CLASS_NAME, "mnav")
print("找到的链接数量:", len(baiduLinks))
print("链接文本如下:")
for link in baiduLinks:
print(link.text)
结果
找到的链接数量: 9
链接文本如下:
新闻
hao123
地图
贴吧
视频
图片
网盘
文库
更多
Process finished with exit code 0
嵌套查找
baiduSearchForm = driver.find_element(By.ID, "form")
baiduSearchTextbox = baiduSearchForm.find_element(By.ID, "kw")
页面元素的基本操作
单击元素
webElement.click()
输入内容或者上传附件
webElement.send_keys("要输入的内容")
清空元素内容
webElement.clear()
提交表单元素
webElement.submit()
下拉框元素的选项操作
导入Select包
from selenium.webdriver.support.select import Select
选项文本、选项值、选项索引
Select(selectWebElement).select_by_visible_text("每页显示30条")
Select(selectWebElement).select_by_value("20")
Select(selectWebElement).select_by_index(0)
例子
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("https://tieba.baidu.com/f/search") # 该地址已失效
selectWebElement = driver.find_element(By.NAME, "rn")
Select(selectWebElement).select_by_visible_text("每页显示30条")
time.sleep(3)
Select(selectWebElement).select_by_value("20")
time.sleep(3)
Select(selectWebElement).select_by_index(0)
获取页面元素的内容
获取元素基本属性
获取元素文本值
格式
webElement.text
例子
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com") # 该地址已失效
baiduMapLink = driver.find_element(By.PARTIAL_LINK_TEXT, "地")
print("文本值为:", baiduMapLink.text)
获取元素的标签类型
webElement.tag_name
获取选中状态
webElement.is_selected()
获取可编辑状态
webElement.is_enabled()
判断元素是否已显示
webElement.is_displayed()
获取HTML属性、DOM属性、CSS属性
HTML
webElement.get_attribute("属性名称")
例子
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com") # 该地址已失效
baiduSearchTextbox = driver.find_element(By.ID, "kw")
baiduSearchTextbox.send_keys("hello world")
print("获取已设定HTML属性")
print("id: ", baiduSearchTextbox.get_attribute("id"))
print("name: ", baiduSearchTextbox.get_attribute("name"))
print("class: ", baiduSearchTextbox.get_attribute("class"))
print("value: ", baiduSearchTextbox.get_attribute("value"))
print("maxlength: ", baiduSearchTextbox.get_attribute("maxlength"))
print("autocomplete: ", baiduSearchTextbox.get_attribute("autocomplete"))
print("获取未设定HTML属性")
print("style: ", baiduSearchTextbox.get_attribute("style"))
print("height: ", baiduSearchTextbox.get_attribute("height"))
print("draggable: ", baiduSearchTextbox.get_attribute("draggable"))
print("获取不存在的HTML属性")
print("tongering", baiduSearchTextbox.get_attribute("tongering"))
driver.quit()
结果
获取已设定HTML属性
id: kw
name: wd
class: s_ipt
value: hello world
maxlength: 255
autocomplete: off
获取未设定HTML属性
style:
height: 0
draggable: false
获取不存在的HTML属性
tongering None
获取DOM元素
格式
webElement.get_property("属性名称")
-
对
标准
HTML有效,对非标准
属性无效标准属性即
HTML自带属性
,非标准属性即自命名属性
-
HTML属性和DOM属性时
实时
同步的但是input.value是
单向
的HTML---->DOM ✅
DOM---->HTML❌
区别:HTML的get_attribute函数和get_property函数的区别
get_attribute 不区分大小写
get_property 区分大小写
HTML映射到DOM 极少数名称可能不同,如:
get_attribute("class")
get_property ("className")
HTML映射到DOM 极少数值可能不同,如:
get_attribute 返回单个字符串,以;分隔
get_property 返回字符串数组
HTML设置为相对路径,href获得的结果也不一样,如:
get_attribute 获得相对路径
get_property 获得完整路径
获得元素的CSS属性
格式
webElement.value_of_css_property("CSS属性名称")
获取元素的位置与大小
格式
webElement.location # 获取位置对象
webElement.size # 获取大小对象
webElement.rect # 获取位置和大小对象
获取下拉元素的选项
格式
from selenium.webdriver.support.select import Select
SelectWebElement.first_selected_option # 获取首个已选中对象
SelectWebElement.all_selected_options # 获取全部已选中对象
SelectWebElement.options # 获取提供的所有选项
例子
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/f/search/adv")
selectWebElement = driver.find_element(By.NAME, "rn")
print("首个已选中项:", Select(selectWebElement).first_selected_option.text)
selectedOptions = ""
for selectedOption in Select(selectWebElement).all_selected_options:
selectedOptions += selectedOption.text + ";"
print("全部已选中项:", selectedOptions)
supportedOptions = ""
for supportedOption in Select(selectWebElement).options:
supportedOptions += supportedOption.text + ";"
print("提供的所有选项:", supportedOptions)
driver.quit()
处理浏览器弹出框
弹出框的确认与取消
Alert.accept() # 单击确认按钮
Alert.dismiss() # 单击取消按钮
实例
alert = driver.find_element(By.XPATH, "//input[@value='Alert']")
alert.click()
time.sleep(3)
driver.switch_to.alert.accept()
获取弹出框的文本
Alert.text
向弹出框输入内容
Alert.send_keys("要输入的内容")
多网页切换操作
多浏览器窗口的切换操作
driver.current_window_handle # 获得WebDriver当前正在操作的浏览器窗口句柄
driver.window_handles # 获得该WebDriver实例下的全部句柄
driver.switch_to.window(窗口句柄) # 切换到指定窗口
例子
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print("未操作前的全部窗口句柄:", driver.window_handles)
driver.find_element(By.LINK_TEXT, "登录").click()
time.sleep(3)
driver.find_element(By.LINK_TEXT, "立即注册").click()
time.sleep(3)
print("单击立即注册按钮后的全部窗口句柄:", driver.window_handles)
print("当前窗口句柄:", driver.current_window_handle)
driver.switch_to.window(driver.window_handles[1])
driver.find_element(By.NAME, "userName").send_keys("CustomUserName")
time.sleep(3)
print("切换到注册页后的当前窗口句柄:", driver.current_window_handle)
driver.switch_to.window(driver.window_handles[0])
time.sleep(3)
driver.find_element(By.CLASS_NAME, "close-btn").click()
print("切换回首页后的当前窗口句柄:", driver.current_window_handle)
输出结果
未操作前的全部窗口句柄: ['7D62F31317A753077CEEA96DF0B24086']
单击立即注册按钮后的全部窗口句柄: ['7D62F31317A753077CEEA96DF0B24086', 'F6EA3B671021699A27E885D5C9821D3B']
当前窗口句柄: 7D62F31317A753077CEEA96DF0B24086
切换到注册页后的当前窗口句柄: F6EA3B671021699A27E885D5C9821D3B
切换回首页后的当前窗口句柄: 7D62F31317A753077CEEA96DF0B24086
IFrame切换
在AJAX之前IFrame就很火,现在寥寥无几
现在一般使用IFrame用来引入一些空白界面,处理与其他网站之间的同步通信,例如跨域LocalStorage等操作。
driver.switch_to.frame(IFrame元素) # 切换到当前页面(或IFrame)的下一级指定IFrame中
driver.switch_to.parent_frame() # 切换到当前IFrame的上一级页面(或IFrame)中
结束WebDriver会话
driver.close()
:关闭WebDriver当前所在窗口
driver.quit()
:关闭所有相关窗口并结束会话