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://www.baidu.com/&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_handles7. 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"