Selenium是一款浏览器自动化框架,Webdriver是其核心,同过Webdriver将自动化脚本转化为浏览器操作指令。
一般操作逻辑为:
-打开网页
-定位页面元素(链接,按钮,输入框等)
-操作页面元素(点击,输入)
-定位并操作下一个页面元素
Webdriver的工作原理
Webdriver会在本地启动一套WebService服务并绑定一个动态端口,脚本运行时通过selenium将请求发送到Webdriver服务端,然后经过不同的浏览器驱动,转换为浏览器指令。
浏览器基本操作
- 方法
get():打开网页
forward():前进
back(): 后退
refresh(): 刷新页面
maximize_window():最大化窗口
set_window_size():设置窗口大小
close(): 关闭当前页面
quit(): 退出浏览器
- 属性
title:标题
current_url:当前网址
page_source:网页源代码
页面元素定位
8种基本定位方式:
通过id定位: find_element_by_id()
通过name定位: find_element_by_name()
通过class定位: find_element_by_class_name()
通过tag定位: find_element_by_tag_name()
通过link定位: find_element_by_link_text()
通过partial link定位: find_element_by_partial_link_text()
通过xpath定位: find_element_by_xpath()
通过css定位: find_element_by_css_selector()
补充:用By定位元素:
find_element(By.ID,"")
find_element(By.NAME, "")
find_element(By.CLASS_NAME, "")
find_element(By.TAG_NAME, "")
find_element(By.LINK_TEXT, "")
find_element(By.PARTIAL_LINK_TEXT, "")
find_element(By.XPATH, "")
find_element(By.CSS_SELECTOR, "")
当元素拥有相同的id/name/class_name/tag_name等时,可以定位到所有的元素,然后按顺序取得具体某个元素,这里使用find_elements_by_***,注意对一个s
l = browser.find_elements_by_id("u")
for i in l:
i.click()
l[2].click()
lables = browser.find_elements_by_tag_name("label")
print(lables[2].text)
分层定位(当一个元素不好定位时,可以先定位到容易定位的父级/祖先级元素,然后使用父级/祖先级元素继续定位,如:)
fardiv = browser.find_element_by_class_name("fathdiv") # 先定位到父级元素
labels = fardiv.find_elements_by_tag_name("label") # 使用父级元素向下定位
print(labels[2].text)
页面元素操作
link 链接
click()
input 输入框
send_keys(): 输入
clear(): 清空输入框
get_attribute("value"): 获取输入框的值
button 按钮
click():
isEnabled(): 是否可用
submit():type=submit的按钮可以使用submit()同click()用于提交表单
radio/checkbox 单选/复选框
click(): 定位到选框可直接点击
is_displayed(): 是否展示
is_selected(): 是否选中状态
select 下拉框(需要用Select)
select_by_index(): 按索引选择选项
select_by_value(): 按value值选择选项
select_by_visiable_text(): 按选项名选择选项
area = Select(browser.find_element_by_id("areaID"))
area.select_by_visible_text("上海")
sleep(1)
area.select_by_index(1)
sleep(1)
area.select_by_value("1")
万能的XPath
XPath即XML路径语言,支持从xml或html中查找元素节点,使用XPath完全可以替代其他定位放式,如:
find_element_by_xpath('//*[@id=""]')等同于find_element_by_id("")
find_element_by_xpath('//*[@name=""]')等同于find_element_by_name("")
find_element_by_xpath('//*[@class=""]')
等同于find_element_by_class_name("")
find_element_by_xpath('//标签名')等同于find_element_by_tag_name("标签名")
find_element_by_xpath('//a[contains(text(),"")]')
等同于find_element_by_link_text("")
find_element_by_xpath('//*[@id=""]')
等同于find_element_by_partial_link_text("")
路径
/绝对路径: /html/body/div
//相对路径: //div/form //*/form 路径中可以使用 *代表任意标签
.当前路径: //div/form/. 等同于//div/form
..上级路径: //div/form/.. 等同于//div
索引
从1开始: /html/body/div[2] //div[1]/form
属性
@属性名:定位包含特定属性名的标签, 如//input[@class]
@属性名="属性值":定位特定属性名=属性值的标签,如//input[@id="kw"]
@="属性值":定位任意属性名=属性值的标签, 如 //input[@='kw']
多属性结合定位://input[@id="kw" and @class='kw-class']或//input[@id="kw"][@class="kw-class"] (and处也支持使用or,表示或)
函数
text():标签中的文本值,如//a[text()="百度首页走起~"]
contains(): 包含,如//a[contains(text(), "百度首页")]
starts-with(): 以**开头,如//a[starts-with(text(), "百度"]
last(): 最后一个, 如//div[last()]
轴
parent: 父标签
child:子标签
following: 后面的,如://*[text()="用户名"]/following::input[1] # 紧邻文本为用户名的输入框
preceding:前面的
弹出框处理
allert警告框
alert = driver.switch_to.alert()
alert.accept() # 确认 或alert.dismiss() 关闭
confirm确认框
confirm = driver.switch_to.alert()
confirm.accept() # 确认 或alert.dismiss() 取消
propmt提示框
propmt = driver.switch_to.alert()
propmt.send_keys() 输入
propmt.accept() # 确认 或alert.dismiss() 关闭
模态框
直接定位即可
授权对话框
在打开的url中使用用户名和密码打开,格式如下
http://use:password@www.***.com
框架页面处理
iframe: 嵌入在网页body中的单独框架(框架拥有一套独立的html代码)
frameset: 框架组,包含多个frame
frame:每个frame引用一个独立的网页
因为frame/iframe框架是一套独立的网页,因此frame/iframe中的元素不能直接定位到
driver.switch_to.frame(name/id/index/Element)
name: frame/iframe的name属性
id: frame/iframe的id属性
index: 如:0,第一个frame
Element: 定位到的frame/iframe,再切换到指定frame
driver.switch_to.parent_frame(): 切换到父级frame, 子frame之间不能相互切换
driver.switch_to.default_content(): 跳出所有frame
示例:
from selenium import webdriver
from time import sleep
browser = webdriver.Chrome()
browser.maximize_window()
browser.get("urlxxx")
browser.switch_to.frame("i") #总的frame
browser.switch_to.frame(0)
print(browser.find_element_by_tag_name("h3").text)
browser.switch_to.parent_frame()
browser.switch_to.frame(1)
print(browser.find_element_by_tag_name("h3").text)
browser.switch_to.parent_frame()
browser.switch_to.frame(2)
print(browser.find_element_by_tag_name("h3").text)
browser.switch_to.default_content()
参考链接:https://www.jianshu.com/p/1525db9dab78
链接:https://www.jianshu.com/p/98bd62d39a0a
网友评论