python的基础语法已经了解了,就不介绍了。
学习Selenium自动化编程,最重要的就是元素定位了,只有找准元素才能对它进行操作
1. 启动浏览器
因为浏览器环境是Firefox44,所以以下启动方式均以Firefox为例。
# *-coding:utf-8-*-
from selenium import webdriver
driver =webdriver.Firefox()
driver.get('https://www.baidu.com/')
即可看到火狐启动并且到百度首页。不过这里有一个奇怪的现象,就是浏览器会闪退然后才打开。
2. 定位元素
selenium提供了八种单数定位方式
1>.id定位 find_element_by_id()
2>. name定位 find_element_by_name()
3>.class定位 find_element_by_class_name()
4>.tag定位 find_element_by_tag_name()
5>link定位 find_element_by_link_text()
6>partial link定位 find_element_by_partial_link_text()
7>.XPath定位 find_element_by_xpath("//标签名[@属性='属性名']")
8>. css定位 find_element_by_css_selector()
其次,还有八种复数定位,将以上的element替换为elements,定位的是多个元素,这个时候可以用索引找到具体的
find_element(By.ID,"")可以看做以上定位的简写变型,其中By需要导入
from selenium.webdriver.common.by import By
find_element(By.NAME,"")、find_element(By.CLASS_NAME,"")
这里需要着重介绍一下xpath和css定位,首先Firefox需要安装firebug/firepath插件,直接在浏览器内调试,方便减少代码改写时间。
XPath的定位 //标签名[@属性='属性名']这种格式,现在具体讲解一下
//表示相对路径,也有绝对路径,像/html/body/div/div[1]这样的,但一般很少会用
属性包括id、class、name、href、value等,可参照html中的属性,均可以用这种方式
也可以多个属性组合,如//input[@type='radio' and @name='s1']
文本匹配:有时候只看到页面的内容,而不需要查看它的属性时可以参考text()匹配
//*[text()='文本内容']其中*匹配任何tag标签名
模糊匹配://*[contains(text(),'文本部分内容')],//*[contains(@name,'部分name名称')]等
以什么开头匹配 //*[starts-with(@id,'id属性名部分')]
返回到父节点向linux的..命令即可
选取的是百度首页的登录按钮
# 1.绝对路径
driver.find_element_by_xpath('/html/body/div/div/div/div/a[7]')
# 2.相对路径:
driver.find_element_by_xpath(".//*[@id='u1']/a[7]")
# 3.根据ID加class
driver.find_element_by_xpath(".//*[@id='u1']/a[@class='lb']")
# 4.根据ID加name
driver.find_element_by_xpath(".//*[@id='u1']/a[@name='tj_login']")
# 5. 根据ID+href
driver.find_element_by_xpath(
".//*[@id='u1']/a[@href='https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F&sms=5']")
# 6. 根据text()
driver.find_element_by_xpath(".//*[@id='u1']/a[text()='登录']")
# 7. contains
driver.find_element_by_xpath(".//*[@id='u1']/a[contains(@href,'login')]")
# 8. start-with()
driver.find_element_by_xpath(".//*[@id='u1']/a[starts-with(text(),'登')]")
# 9. and
driver.find_element_by_xpath(".//*[@id='u1']/a[@name='tj_login' and @class='lb']")
# 10. following-sibling同级后
driver.find_element_by_xpath(".//*[@name='tj_trxueshu']/following-sibling::a[1]")
# 11. preceding-sibling同级前
driver.find_element_by_xpath(".//*[@class='bri']/preceding-sibling::a[2]")
CSS的定位:学过css的人应该都知道css的选择器,比如#id、.class、标签(不带任何符号),[属性='属性名']等
以上等级中1、2记住即可,3一般不做要求,但nth-child()需要注意,因为css定位中不用索引了,所以这个可以充当index作用
如:[name='NR']>option:nth-child(2)表示名字NR的第二个option子标签
一般来说:CSS比xpath定位更快,且语法更简洁
3. 基本操作
当元素定位到了需要对其进行操作,如输入框输入内容,下拉框选择等
1> clear()清空输入框
2> send_keys()输入文本内容
3> click()模拟单击鼠标
4> submit()模拟回车Enter
但毕竟基本操作能做的比较少,且分散,selenium的ActionChains包用来模拟鼠标事件
from selenium.webdriver.common.action_chains import ActionChains
context_click()右击
double_click()双击
drag-and_drop(source, target)拖动
move_to_element()悬停
selenium还提供了键盘事件
所有的操作都需要加上perform()才会生效
setup = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(setup).perform()
from selenium.webdriver.common.keys import Keys
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘F1
……
Send_keys(Keys.F5)键盘F5
…
send_keys(Keys.F12) 键盘F12
或者获取定位到元素的一些信息
1> 获取元素属性值 get_attribute('属性')
2> 判断元素是显示还是隐藏 is_displayed()
3>获取元素size .size
4. 浏览器操作
具体有返回上页driver.back()、下一页driver.forward()、刷新driver.refresh()、退出driver.close()#关闭当前窗口、driver.quit()#退出浏览器,清空临时文件
获取title值 driver.title
获取浏览器名称 driver.name
5. 切换iframe
通过id/name/frame定位
switch_to_frame(name or id or frame_element )
通过页面上iframe的索引定位
driver.switch_to.frame(0) # 用frame的index来定位
# 跳出所有frame,回到主界面
driver.switch_to.default_content()
driver.switch_to.parent_frame() # 返回上一级
6. 多窗口
多个窗口时需要切换到特定窗口操作,这个时候用到窗口句柄。
1.获取当前句柄
driver.current_window_handle
2.获取所有句柄
driver.window_handles
7. Select下拉框
selenium针对下拉框(select-option类型)有一个包Select
from selenium.webdriver.support.select import Select
首先定位到select下拉框
s = driver.find_element(By.ID, 'nr')
time.sleep(1)
Select(s).select_by_value('20')
Select提供了多种方法
select_by_index(index) #通过index选择
select_by_value(value) #通过value属性
select_by_visible_text(text) #通过选项可见文本
deselect_by_index(index) # 反选
deselect_by_value(value)
deselect_by_visible_text(text)
deselect_all() # 不选
8. 弹出框
alert框是浏览器弹出来的,是不能用web元素定位的,需要操作是要先切换到alert框上
# 切换到弹出框
a = driver.switch_to_alert()
# 打印弹出框文本信息
print(a.text)
# 确定按钮
a.accept()
# 取消按钮
a.dismiss()
浏览器的弹出框共分为
警告框alert
确认框confirm
提示框prompt
三种
注:测试完成后要quit()退出浏览器,不然c盘的临时文件会越来越多。
作业:
百度首页-选择设置-搜索设置-保存设置
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
import time
#Firefox 配置
prifile_directory = 'C://Users//Administrator//AppData//Roaming//Mozilla//Firefox//Profiles//ardla6e5.default'
profile = webdriver.FirefoxProfile(prifile_directory)
def alertClick(url):
driver.get(url)
'''第一步: 找到设置按钮'''
setup = driver.find_element_by_link_text('设置')
'''第二步: 鼠标悬停,点击搜索按钮'''
ActionChains(driver).move_to_element(setup).perform()
time.sleep(0.5)
driver.find_element_by_link_text('搜索设置').click()
# time.sleep(3) # 页面跳转
'''第三步: 设置界面,找到下拉框'''
sel = driver.find_element(By.ID, 'nr')
time.sleep(1)
'''第四步: 设置下拉框选项'''
Select(sel).select_by_index(2)
sel.click()
time.sleep(1)
'''第五步: 点击保存设置按钮'''
driver.find_element_by_css_selector('.prefpanelgo').click()
time.sleep(1)
'''第六步: 切换alert框,并点击确定'''
alert = driver.switch_to_alert()
alert.accept()
if __name__ == '__main__':
driver = webdriver.Firefox(profile)
alertClick('https://www.baidu.com')
find_Element()
by_id= "id"
by_xpath = "xpath"
by_link_text = "link text"
by_partial_text = "partial link text"
by_name = "name"
by_tag_name = "tag name"
by_class_name = "class name"
by_css_selector = "css selector"