阅读:
GUI自动化测试学习内容:
什么是自动化测试?
自动化测试就是把人对软件的测试行为转化由机器执行测试行为的一种实践。对于最常见的GUI自动化测试来讲,就是由自动化测试模拟之前那需要人工在软件界面上的各种操作,并且自动验证其结果是否符合预期结果。
自动化测试是否会把测试工程师淘汰?
从分析——计划——设计——实现——执行这个流程中,分析、计划、设计是需要人工进行的,实现、执行的过程中,也有自动化无法满足要求的情况。
什么样的项目适合自动化?
自动化测试有广义和狭义之分:
测试划分:功能、性能、安全
测试阶段划分:基于代码的单元测试、集成阶段的接口测试、系统测试阶段的UI自动化
自动化测试用例设计原则:
什么是Selenium webdriver?
Se:硒
Chromedriver下载镜像:
geckodriver下载镜像(firefox):
http://npm.taobao.org/mirrors/geckodriver/
3.在pycharm中导入webdriver即可使用
from selenium import webdriver
02 webdriver的工作原理

即编写脚本通过http请求发送relful请求,如:find_ element_ by_ class_ name ,脚本通过driver. exe驱动server 服务器,创建session, 绑定ip,向浏览器进行发送操作,并返回响应结果。
LOVE四步法:

eg

- 打开: driver. get(URL)
-
- 关闭:driver.quit()结束进程或driver.close()仅关闭当前窗口
-
- 设置窗口大小:driver.set_window_size(200, 500)
-
- 最大化窗口:driver.maxmize_window()
-
- 获取网页资源:driver.page_source
-
- 获取窗口名称:driver.name
-
- 刷新页面:driver.refresh()
-
- 获取页面标题:driver.title
-
- 获取当前页面的url地址:driver.curret_url
-
- 获取当前页面截图:driver.get_screenshot_as_file(path)
webdriver常用API——常用的八种定位方式:
格式:
- from selenium import webdriver
-
- driver = webdriver.Chrome()
-
-
-
- #id定位
-
- name = driver.find_element('id', 'username')
-
- name.send_keys('教育')
-
-
-
- #name属性定位
-
- driver.find_element('name', 'sex').click() # 选中性别中男这个选项 返回找到的第一个值
-
- driver.find_elements('name', 'sex')[1].click() # find_elements将以列表形式返回多个符合条件的元素,返回列表的第二个,列表从0下标开始
-
-
-
- #class name属性定位
-
- driver.find_element('class name', 'dotborder').send_keys('凡云教育')
-
-
-
- #对于复合样式的元素,不能直接使用class name方法来进行定位,以下语句报错
-
- driver.find_element('class name', 'dotborder border').send_keys('aaaaa')
-
-
-
- #tag name定位:一般用于寻找同类元素,返回列表
-
- elements = driver.find_elements('tag name', 'input')
-
- print(len(elements))
-
-
-
- #link text和partial link text专门用于定位超链接a标签。
-
- driver.find_element('link text', '打开百度').click() #全匹配
-
- driver.find_element('partial link text', '百度').click()#部分匹配
-
-
-
- #xpath定位
-
- #绝对路径定位法
-
- print(driver.find_element('xpath', '/html/body/form'))
-
-
-
- #相对路径定位法
-
- print(driver.find_element('xpath', '//tbody/tr[3]/td[2]/i').text)
-
- print(driver.find_element('xpath', '//tbody/tr[3]//i').text)
-
-
-
- #xpath属性定位
-
- print(driver.find_element('xpath', "//input[@type='file']"))
-
- driver.find_element('xpath', "//input[@type='text'][@mode='sub']").send_keys('18')
-
-
-
- # xpath模糊定位
-
- print(driver.find_element('xpath', "//*[contains(text(), '60岁')]").text)
-
- driver.find_element('xpath', "//textarea[contains(@placeholder, 'yourself')]").send_keys('hello,教育')

find_element和find_elements
对于查找元素的方法,在webdriver中四种不同的写法,请注意区别:
- find_element('xx','selector')根据指定的方式定位元素,仅返回找到的第一个元素,如果美有元素符合则直接抛出异常
- find_elements('xx','selector')根据指定的方式定位元素,以列表形式返回找到的所有元素,如果没有元素符合则返回空列表
- find_element_by_xx('selector')根据指定的方式定位元素,仅返回找到的第一个元素,如果美有元素符合则直接抛出异常
- find_elements_by_xx('selector')根据指定的方式定位元素,以列表形式返回找到的所有元素,如果没有元素符合则返回空列表
- id:find_element('id','selector')
- name:find_element('name','selector')
- class name:find_elemnet('class name','selector')
- tag name:find_elementfind_elements('tag name','selector')
使用无痕窗口,因为没有任何cookie,代码打开的浏览器就是没有的,所以定位元素的时候,使用无痕窗口打开。
find_element和find_elements
对于查找元素的方法,在webdriver中四种不同的写法,请注意区别:
- find_element('xx','selector')根据指定的方式定位元素,仅返回找到的第一个元素,如果美有元素符合则直接抛出异常
- find_elements('xx','selector')根据指定的方式定位元素,以列表形式返回找到的所有元素,如果没有元素符合则返回空列表
- find_element_by_xx('selector')根据指定的方式定位元素,仅返回找到的第一个元素,如果美有元素符合则直接抛出异常
- find_elements_by_xx('selector')根据指定的方式定位元素,以列表形式返回找到的所有元素,如果没有元素符合则返回空列表
eg:
对于一段html
<input id="username_id" type="text" name="username" class="red">
如下代码都可以获取到这个标签:
- #id
-
- driver.find_element_by_id("username_id")
-
- #name
-
- driver.find_elemenet_by_name("username")
-
- #class_name
-
- driver.find_element_by_class_name("red")
-
- #tag
-
- driver.find_element_by_tag_name("input")


实例:
- from selenium import webdriver
-
- from time import sleep
-
-
-
- driver=webdriver.Chrome()
-
- url = 'https://www.baidu.com'
-
- #使用浏览器打开指定页面
-
- driver.get(url)
-
-
-
- #id 查找元素(标签、标记、节点)
-
- driver.find_element("id","kw").send_keys("肖战王一博")
-
- driver.find_element("id","su").click()
-
-
-
- #name
-
- driver.find_element("name","wd").send_keys("肖战王一博")
-
- driver.find_element("id","su").click()
-
-
-
- #class_name
-
- driver.find_element("class name","s_ipt").send_keys("肖战王一博")
-
- driver.find_element("id","su").click()
-
-
-
- sleep(3)
-
- #关闭浏览器
-
- driver.quit()
复合样式不能用class去定位,直接报错,可以使用css selector进行定位

对于一段html
"http://www.baidu.com" id = "fwA" target="_blank">访问 百度 网站
如下代码都可以获取到这个标签
- #link_text
-
- driver.find_element("link text","访问 百度 网站")
-
- #partial_link_text
-
- driver.find_element("partial link text","访问")
注意:
如果相同的规则回队应多个标签,那么这些方法会返回第一个
实际例子:

- #定位a标签
-
- #link_text
-
- driver.find_element("link text","hao123").click()
-
-
-
- #partial_link_text 如果文本比较长 ,定位部分可以使用这个,能够完整尽量完整
-
- driver.find_element("partial link text","hao12").click()
web页面元素:
1、HTML页面基本结构
-
- html文档头部区域,页面不可见
-
- html文档内容区域,页面可见
-
2、常见的页面元素:
css选择器语法:
| 选择器 | 例子 | 例子描述 |
| .class | .intro | 选择class="intro"的所有元素 |
| #id | #firstname | 选择id="firstname"的所有元素 |
| * | * | 选择所有元素 |
| element | p | 选择所有 元素 |
| element,element | div,p | 选择所有 元素和所有 元素 |
| element element | div p | 选择 元素内部的所有 元素 |
| element>element | div>p | 选择父元素为 元素的所有 元素 |
| element+element | div+p | 选择紧接在 元素之后的所有 元素 |
| [attribute] | [tartget] | 选择带有target属性所有元素 |
| [attribute=value] | [target=_nlank] | 选择target="_bklank"的所有元素 |
参考:
selenium:css_selector定位详解 - 也许明天 - 博客园
方法:
方法:
- find_element_by_css_selector(CSS选择器)
-
- #new:
-
- find_element('css selector','css选择器')
eg:
以上的百度搜索框
- #id
-
- find_element_by_css_selector("#kw").send_keys("博君一肖")
-
- # . : class
-
- find_element_by_css_selector(".s_ipt").send_keys("博君一肖")
-
- #name
-
- find_element_by_css_selector("[name=wd]").send_keys("博君一肖")
-
- #value
-
- find_element_by_css_selector("[value=百度一下]").click()
-
- #多属性定位,以下返回的是列表
-
- driver.find_element('css selector','[type="checkbox"][name="hobby"]')[2].click()
-
- #利用父子关系来定位目标元素,父元素>第一个子元素,nth-child指定子元素,序号从1开始
-
- deriver.find_element('css selector','tbody>tr:nth-child(1)>td:nth-child(2)>input')
-
- #父子关系(>)孙子关系(空格)
-
- driver.find_element('css selector','tbody>tr:nth-child(3) i')
-
- #模糊匹配*=
-
- driver.find_element('css selector','input[value*="测试2"]').click()
eg:
- from time import sleep
-
- from selenium import webdriver
-
- driver = webdriver.Chrome()
-
- driver.get('https://www.baidu.com/')
-
- #找class=s_ipt
-
- driver.find_element('css selector','.s_ipt').send_keys('博肖希望小学')
-
- driver.find_element('css selector','#su').click()
-
- sleep(1)
-
- driver.quit()
复合样式不能用class去定位,直接报错,可以使用css selector进行定位

driver.find_element('css selector','.dotborder.border')
F12的console

xpath = xml path
XML和HTML一样是标签语言,通过标签的嵌套来表达信息,自然而言,形参了父节点、子节点、后代节点、同胞节点等关系。而xpath就是用来在这些节点中找到所需要的
XML: 可扩展标记语言
HTML:超文本标记语言
Xpath语法
绝对路径和相对路径
完整:
| 表达式 | 描述 |
| nodename | 选区此节点的所有子节点 |
| / | 从根节点选取 |
| // | 从匹配选择的当前节点选择文档中的节点 |
| . | 选区当前节点 |
| .. | 选区当前节点的父节点 |
| 表达式 | 描述 |
| @ | 选取属性 |
| text() | 获取文本 |
| 路径表达式 | 结果 |
| /bookstore/book[1] | 选取属于bookstore子元素的第一个book元素 |
| /bookstore/book[last()] | 选取属于bookstore子元素的最后一个book元素 |
| /bookstore/book[last()-1] | 选取属于bookstore子元素的倒数第二个book元素 |
| //book/title[text()='Harry Potter'] | 选择所有book下的title元素,仅仅选择文本为Harry Potter的title元素 |
| //title[@lang="eng"] | 选择lang属性值为eng的所有title元素 |

实例:
还是百度的例子
- #通过xpath的方式定位
-
- driver.find_element("xpath","//*[@id='kw']").send_keys("博君一肖")
-
- driver.find_element("xpath","//*[@id='su']").click()
-
-
-
- #xpath定位
-
- #绝对路径定位法
-
- print(driver.find_element('xpath', '/html/body/form'))
-
-
-
- #相对路径定位法。必须以"//"开头
-
- print(driver.find_element('xpath', '//tbody/tr[3]/td[2]/i').text)
-
- #简化,tr下只有一个i元素,不管i是哪一级,注意前面是“//”
-
- print(driver.find_element('xpath', '//tbody/tr[3]//i').text)
-
-
-
- #xpath属性定位 ,input标签这种的type='file'
-
- print(driver.find_element('xpath', "//input[@type='file']"))
-
- #多属性
-
- driver.find_element('xpath', "//input[@type='text'][@mode='sub']").send_keys('18')
-
-
-
- # xpath模糊定位,根据关键词查找不能等于
-
- print(driver.find_element('xpath', "//*[contains(text(), '60岁')]").text)
-
- driver.find_element('xpath', "//textarea[contains(@placeholder, 'yourself')]").send_keys('hello,教育')

eg:
- driver.find_elemnet("id","kw").send_keys("肖战")
-
- time.sleep(3)
-
- driver.find_element("id",""kw").clear()
- time.sleep(3)
- driver.find_element("id",""kw").send_keys("王一博")
-
- driver.find_element("id",""su").click()
- size 返回元素大小
- text 获取元素的文本
- get_attribute() 获取属性值
- is_display() 判断元素是否可见
- is_enabled() 判断元素是否可用
eg:
- print(driver.find_element("id",""kw").size)
- print(driver.find_element("id",""kw").text)
-
- print(driver.find_element("id",""kw").is_enable())
- print(driver.find_element("id",""kw").is_display())
-
- driver.find_element("xpath",""//*[text()='新闻']").get_attribute("herf")
driver.find_element_by_id('username').get_attribute('value')
- #判断是否可见
-
- print(driver.find_element_by_id('kw').is_displayed())
-
- #判断是否可用
-
- print(driver.find_element_by_id('kw').is_enable())
-
- #判断是否已经被选中,如果选择则返回True,否则返回false
-
- print(driver.find_element_by_id('kw').is_selected())
- #shift+字母小写实现大写输入,需要进行复合按键来操作下,模拟人操作键盘
-
- from selenium.webdriver.common.keys import Keys #Keys可以帮助使用复合按键
-
- driver.find_element().send_keys(Keys.SHIFT,'bx'*50) #输入的值大写和小写都可以,*50:输入该值50个
- from selenium.webdriver.support.ui import Select
-
- Select(driver.find_element_by_id('status')).select_by_index(3) #选择的序号,下标从0开始
-
- Select(driver.find_element_by_id('status')).select_by_visible_text('Ongoing') #根据文本进行选择
-
- Select(driver.find_element_by_id('status')).select_by_value('sh') #便签里面的value=''的值
- from selenium import webdriver
-
- #from time import sleep
-
- import time
-
- driver.get('https://www.woniuxy.com')
-
- driver.maximize_window() # 窗口最大化,确保登陆按钮显示在界面上
-
- driver.find_element('link text', '登录').click()
-
- driver.find_element('id', 'l_tel').send_keys('15828183448')
-
- driver.find_element('id', 'l_pass').send_keys(pwd)
-
- time.sleep(10)
-
- driver.find_element('id', 'loginButton').click()
-
- driver.execute_script("window.scrollTo(0, 300);")
-
- time.sleep(1)
-
- driver.find_element('link text', '付费专属').click()
-
- driver.find_element('link text', '查看更多').click()
-
- Select(driver.find_element('id', 'area')).select_by_visible_text('凡云教育')
-
- courses = driver.find_elements('class name', 'course-name')
-
- for course in courses:
-
- if course.text.strip():
-
- print(course.text)
01元素定位方式选择:
02定位元素的注意事项
浏览器操作(方法)
- maximize_window() 最大化浏览器
- set_window_size(width,height) 设置浏览器宽、高像素点
- set_window_position(x,y) 设置浏览器位置,浏览器左上角相对于屏幕左上角位置
- send.keys() 向文本域或文件上传按钮发送文字内容
- back() 后退
- clear() 清除按钮
- click() 点击按钮
- forword() 前进
- refresh() 刷线
- close() 关闭当前页面
- quit() 关闭浏览器
浏览器信息(属性)
- title 获取页面title
- text 获取节点上的文本信息,标签中间的值可获得
- current_url() 获取当前页面URL
- is_displayed() 判断是否显示出来,返回布尔值,用于判断
- get_attribute('属性') 获取指定属性的值,可获取文本框输入的值
eg:
- print(driver.title)
-
- print(driver.current_url())
-
- print(driver.find_element('id','kw').get_attribute('class'))
-
-
-
- #最大化
-
- driver.maximize_window()
-
- #设置浏览器
-
- time.sleep(1)
-
- driver.set_window_size(800,600)
-
- time.sleep(3)
-
- driver.set_window_position(200,200)
-
-
-
- driver.find_element("id","kw").send_keys("bjyx")
-
- driver.find_element("id","su").click()
-
- sleep(2)
-
- driver.back()
-
- time.sleep(2)
-
- driver.forword()
-
- time.sleep()
-
- driver.refresh()
-
- time.sleep(2)
-
- driver.back()
-
- driver.find_element("xpath","//*[text()='hao123']").click()
-
- time.sleep(2)
-
- driver.close()
-
- time.sleep(2)
-
- driver.quit()
3)页面等待
因为web中看到的元素,不一定是写在html代码中的,有可能是通过javascript代码的demo来操作产生出来的。而js产生元素,很可能先要去获取到数据,处理后再去显示的。所以:不一定网页打开,所有元素都在页面中了。如果马上去找,可能会出错。
代码执行速度远远快于页面加载的速度,翻页的时候需要进行页面等待。
等待方式:
可针对每一个元素进行单独设置,等待条件更加灵活。针对某一些元素来执行等待,等待显示。
注意:如果显式等待和隐式等待同时设置,以最长等待时间为准
- from selenuim.webdriver.support import expected_conditions as EC
-
- from selenium.webdriver.support.wait import webDriverwait
常见的EC方法:
- from selenium import webdriver
-
- from selenium.webdriver.common.by import By
-
- from selenuim.webdriver.support import expected_conditions as EC
-
- from selenium.webdriver.support.wait import webDriverwait
-
-
-
- url = 'https://www.baidu.com'
-
- driver = wevdriver.Chrome()
-
- driver.get(url)
-
- #输入框输入要搜索的内容 博肖
-
- driver.find_element("id","kw").send_kesys("博肖")
-
- #点击 百度一下
-
- driver.find_element("id","su").click()
-
-
-
- #显式等待,导包太多了
-
- #EC期待等待的时间 等待某个元素加载完成,每个0.5秒去检测一次,最多等待5秒 ID为1的元素
-
- element = webDriverWait(driver,5).
-
- until(EC.presence_of_location((By.ID,'1')))
-
- #element.sen_keys("admin")
-
- #点击一个搜索到的条目
-
- driber.find_elemenet("id","1").click()
-
-
-
- sleep(3)
-
- #关闭浏览器
-
- driver.quit()
-
-
-
- eg2:
-
- #5代表最多等待5秒,等待id为msg的元素值的参数出现
-
- webDriverWait(driver,5).until(EC.text_to_be_present_in_element('text','msg'),'出错啦:找不到该用户名...')
-
-
-
- #element_to_clickable
-
- webDriverWait(driver,10).until(EC.element_to_clickable(('id','btn3'))
-
-
-
- #inivisibility_of_element_located,如果是不可见的则报错,invisibility是不可见
-
- webDriverWait(driver,5).until(EC.visibility_of_element_located(('id','btn2')))
-
-
-
- #presence_of_element_located
-
- webDriverWait(driver.5).until(EC.presence_of_element_located(('id','btn2')))
显示等待比较灵活,比较麻烦。
若是以后遇到没有找到元素等的问题,可以考虑下是否是没有等待时间。
2.隐式等待
即全局等待
设置依次后(隐式等待只需设置一次),全局有效,在元素没有出现时最多只等待指定时间,但如果再等待时间内,什么时候元素出现什么时候停止等待。
隐式等待只能等待元素生成,当这个元素不存在时就会等定位元素,但当元素存在时则不会等待。当有时侯等的不是元素存不存在,而是等待元素显示的文字,文字还没有生成,则无法获取(这个时候可以使用强制等待)。
隐式等待只能在元素不存在这种情况才能生效,否则不会产生任何等待效果。
implicitly_wait(5)
给浏览器加入了一个默认的设置,在每一次操作这个元素,若没有获取到该元素,则会等待设置的时间,如果找到了则继续,否则抛出元素未找到异常。
eg: 推荐
- from selenium import webdriver
-
-
-
- url = 'https://www.baidu.com'
-
- driver = wevdriver.Chrome()
-
- driver.get(url)
-
- #输入框输入要搜索的内容 博肖
-
- driver.find_element("id","kw").send_kesys("博肖")
-
- #点击 百度一下
-
- driver.find_element("id","su").click()
-
- #隐式等待 implicitly隐含
-
- driver.implicitly_wait(5)
-
-
-
- #点击一个搜索到的条目
-
- driber.find_elemenet("id","1").click()
-
-
-
- sleep(3)
-
- #关闭浏览器
-
- driver.quit()
-
- 3.强制等待
-
- 即固定等待
-
- 优势:
-
- 用法简单,一般用于项目调试,或者用于等待元素状态、文本发生改变
-
- 劣势:
-
- 等待时间固定,如果脚本中大量使用会导致脚本运行效率低
-
- import time
-
- time.sleep(2)
-
- 实例:以百度搜索框为例
-
- from selenium import webdriver
-
- from time import sleep
-
-
-
- #创建webDriver对象 Chrome()封装了谷歌的一些方法
-
- #如果把驱动放置到了 系统环境变量目录中,可不带参数创建
-
- driver=webdriver.Chrome()
-
- #如果没有放置到系统环境变量目录中,需要通过参数指定
-
- #driver = webdriver.chrome(executable_path="./chromedriver.exe")
-
- url = 'https://www.baidu.com'
-
- #使用浏览器打开指定页面
-
- driver.get(url)
-
-
-
- #输入框输入要搜索的内容 博肖
-
- driver.find_element("id","kw").send_kesys("博肖")
-
- #点击 百度一下
-
- driver.find_element("id","su").click()
-
- #强制等待 不是最优解,每个电脑的加载速度不一样
-
- sleep(1)
-
- #点击一个搜索到的条目
-
- driber.find_elemenet("id","1").click()
-
-
-
- sleep(3)
-
- #关闭浏览器
-
- driver.quit()
selenium可以模拟鼠标的操作
需导包:
from selenium.wevdriver.common.action_chains import ActionChians
使用步骤:
perform() 执行-->此方法用来执行以上所有鼠标方法
例子:百度搜索eg
01右击:

- from selenium import webdriver
-
- from time import sleep
-
- from selenium.wevdriver.common.action_chains import ActionChians
-
- from selenium.webdriver.common.by import By
-
-
-
- #创建webDriver对象 Chrome()封装了谷歌的一些方法
-
- #如果把驱动放置到了 系统环境变量目录中,可不带参数创建
-
- driver=webdriver.Chrome()
-
- #如果没有放置到系统环境变量目录中,需要通过参数指定
-
- #driver = webdriver.chrome(executable_path="./chromedriver.exe")
-
- #driver=webdriver.Chrome("chromedriver.exe")与代码同在一文件夹
-
- url = 'https://www.baidu.com'
-
- #使用浏览器打开指定页面
-
- driver.get(url)
-
-
-
- #右击
-
- action = ActionChains(driver)
-
- action.context_click(driver.find_element("id","su"))
-
- #实践的操作一定要执行
-
- action.perform()
-
-
-
- sleep(3)
-
- #关闭浏览器
-
- driver.quit()
02悬停:
悬停摄像头图标

- #其他代码同上
-
- action.move_to_element(driver.find_element("class name","soutu_btn"))
eg2:
百度的:

- driver.get('https://www.baidu.com')
-
- item = driver.find_element('id', 's-usersetting-top')
-
- ActionChains(driver).move_to_element(item).perform() # 模拟鼠标的移动操作
-
- driver.find_element('link text', '高级搜索').click()
隐藏不可操作:

可见可操作:

实操

- driver.get('https://www.qq.com')
-
- item = driver.find_element('class name', 'more-txt')
-
- ActionChains(driver).move_to_element(item).perform()
-
- driver.find_element('link text', '车型').click()
03拖拽

- #拖拽
-
- action.drag_and_drop(driver.find_element("id","div1"),
-
- driver.find_element("id","div2"))
5)键盘操作
element.send_keys()
| 键值 | 解释 |
| send_keys(Keys.BACK_SPACE) | 删除键BackSpace |
| send_keys(Keys.SPACE) | 空格键Space |
| send_keys(Keys.TAB) | 制表键Tab |
| send_keys(Keys.ESPACE) | 回退键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.F12) | 键盘F12 |

实例:

- from selenium import webdriver
-
- from time import sleep
-
- from selenium.webdriver.common.keys import keys
-
-
-
- #创建webDriver对象 Chrome()封装了谷歌的一些方法
-
- #如果把驱动放置到了 系统环境变量目录中,可不带参数创建
-
- driver=webdriver.Chrome()
-
- #如果没有放置到系统环境变量目录中,需要通过参数指定
-
- #driver = webdriver.chrome(executable_path="./chromedriver.exe")
-
- url = 'https://www.baidu.com'
-
- #使用浏览器打开指定页面
-
- driver.get(url)
-
-
-
- el = driver.find_element("id","kw")
-
- #输入python
-
- el.send_keys("python")
-
- time.sleep(2)
-
- #全选
-
- el.send_keys(keys.CONTROL,"a")
-
- time.sleep(2)
-
- #回退键 删除
-
- el.send_keys(keys.BACKSPACE)
-
- time.sleep(2)
-
-
-
- el.send_keys("博肖")
-
- time.sleep(2)
-
-
-
- #全选
-
- el.send_keys(keys.CONTROL,"a")
-
- time.sleep(2)
-
-
-
- #复制
-
- el.send_keys(keys.CONTROL,"c")
-
- time.sleep(2)
-
-
-
- #粘贴
-
- el.send_keys(keys.CONTROL,"c")
-
- time.sleep(2)
-
-
-
- sleep(3)
-
- #关闭浏览器
-
- driver.quit()
下拉框是HTML
- from time import sleep
-
- from selenium import webdriver
-
- from selenium.webdriver.common.by import By
-
- from selenium.webdriver.support.select import Select
-
-
-
- driver = webdriver.Chrome(exectable_path="./chromedriver.exe")
-
- url = r'C:\Users\T\注册A.html'
-
- driver.get(url)
-
-
-
- ele = driver.find_element(By.ID,'selectA')
-
- #强转成select
-
- select = Select(ele)
-
- sleep(1)
-
- #从0开始
-
- select.select_by_index(2)
-
- sleep(1)
-
- select.select_by_value('bj')
-
- sleep(1)
-
- select.select_visible_text('A广州')
-
- sleep(3)
-
- driver.quit()

往右右侧的滚动条,可以上下切换内容
webdriver类库中并没用直接提供滚动条进行操作方法,但是它提供了可调用JavaScript脚本的方法,所以可以通过javascript脚本来达到操作滚动条的目的。
driver.execute_script(js代码字符串)
window.scrollTo(x,y)
window.scrollBy(x,y)
通过driver的execute_script方法,可以做很多事情。
- from selenium import webdriver
-
- import time
-
-
-
- driver=webdriver.Chrome()
-
- url = 'https://www.douyu.com/directory/all'
-
- driver.get(url)
-
- driver.maxmize_window()
-
- time.sleep(3)
-
- driver.find_element_by_xpath("//*[@title='下一页']").click()
-
- time.sleep(3)
-
- #关闭浏览器
-
- driver.quit()
-
- #需要滚动条下拉才能刷新出内容
-
- driver.get(url)
-
- driver.maximize_window()
-
- time.sleep(2)
-
- js_str='window.scrollTo(0,10000)'
-
- driver.execute_script(js_str)
示例:
- from selenium import webdriver
-
- import time
-
-
-
- driver=webdriver.Chrome()
-
- url = 'file:///D:/ship/eg.html'
-
- driver.get(url)
-
- time.sleep(2)
-
- driver.finde_element("id","alerta").click()
-
- #遇到警告框,切换到警告框,然后操作警告框
-
- alert = driver.switch_to.alert
-
- print(alert.text)
-
- time.sleep(2)
-
- alert.dismiss()
-
- time.sleep(3)
-
- #关闭浏览器
-
- driver.quit()
driver.switch_to.frame(frame的名称或者id)
driver.switch_to.default_content()
eg:

- from selenium import webdriver
-
- import time
-
-
-
- driver=webdriver.Chrome()
-
- url = 'https://mail.qq.com'
-
- driver.get(url)
-
- time.sleep(2)
-
- print(driver.find_element_by_class_name("login_pcture_title").text)
-
- #可以是frame的id、name
-
- driver.switch_to.frame("login_frame")
-
- driver.find_element("id","u").send_keys("100001")
-
- time.sleep(2)
-
- driver.switch_to.default_content()
-
- print(driver.find_element("class name","login_pcture_title").text)
-
- time.sleep(3)
-
- #关闭浏览器
-
- driver.quit()
-
-
-
- #切换到子frame:
-
- driver.switch_to.frame(driver.find_element_by_xpath('/html/body/div[4]/iframe'))
eg2:

- from selenium import webdriver
-
- driver.get("http://www.fanyunedu.com:5000/general/frame")
-
- # 切换到iframe内部的上下文环境中
-
- driver.switch_to.frame(driver.find_element('name', 'iframe1'))
-
- driver.find_element('id', 'kw').send_keys('python')
-
- driver.switch_to.default_content() # 将上下文环境从iframe中切出来
-
- driver.find_element('link text', '去淘宝').click()
一个浏览器程序可以打开多个网页,每个网页构成了浏览器的一个标签,有些超链接是_target="blank"的,会在新窗口打开,会出现窗口切换。
handler意控制者、处理者,但不是真正的处理对象(可以想象为皮影戏的操作线\杆),在selenium中,通过一个随机生产的字符串uuid来唯一标识一个窗口。
handle:句柄。一个用来标识对象或者项目的标识符,可以用来描述窗体、文件等,记录数据的变动。
driver.window_handles
driver.current_window_handle
driver.switch_to.window(handle)
- from selenium import webdriver
-
- ...
-
- curhandle = driver.current_window_handle #获取当前窗口,不然切换之后,无法切换回来
-
- allhandles = driver.window_handles #获取所有窗口
-
- for handle in allhandles: #循环判断窗口是否为当前窗口
-
- if handle != curhandle: #不是当前窗口即进行切换,则进行后续操作
-
- driver.switch_to_window(handle)
-
- driver.find_element_by_id('test_id').click()
-
- driver.close()
-
- driver.switch_to_window(curhandle) #切换回原来的窗口,继续进行其他操作
-
- driver.finde_element('id','test_id2').click()
3)入门案例
- from selenium import webdriver
-
- import time
-
-
-
- driver=webdriver.Chrome("chromedriver.exe")
-
- url = 'https://www.baidu.com'
-
- driver.get(url)
-
- time.sleep(2)
-
-
-
- print(driver.window_handles)
-
- print(driver.current_window_handle)
-
-
-
- driver.maxsize_window()
-
- driver.find_element("id","kw").send_keys("美女")
-
- driver.find_element("id","su").click()
-
- time.sleep(2)
-
- driver.find_element("id","1").click()
-
- time.sleep(2)
-
-
-
- print(driver.window_handles)
-
- print(driver.current_window_handle)
-
-
-
- #需要切换页面,才可以进行查找,下标从0开始,新打开的页面在所有handle列表的最后面
-
- driver.switch_to.window(driver.window_handles[1])
-
-
-
- time.sleep(2)
-
- #报错,因为没有进行网页切换
-
- driver.find_element("id","currentImg").click()
-
- time.sleep(3)
-
- driver.quit()
-
-
-
- eg:
-
- driver.get('http://www.fanyunedu.com:5000/general/web')
-
- old_window = driver.current_window_handle # 保留当前窗口的句柄
-
- driver.find_element('link text', '打开百度').click()
-
- driver.switch_to.window(driver.window_handles[1]) # 切换到百度的窗口上下文,切换到第二个窗口
-
- driver.find_element('id', 'kw').send_keys('python')
-
- # 切回默认窗口
-
- driver.switch_to.window(old_window)
-
- driver.find_element('name', 'alert1').click()
-
-
-
当出现问题时。需要截图记录。
方法:保存的格式是png格式
driver.get_screenshot_as_file(报存路径)
eg:
- from selenium import webdriver
-
- import time
-
-
-
- driver=webdriver.Chrome("chromedriver.exe")
-
- url = 'https://www.baidu.com'
-
- driver.get(url)
-
- time.sleep(2)
-
-
-
- print(driver.window_handles)
-
- print(driver.current_window_handle)
-
-
-
- driver.maxsize_window()
-
- driver.find_element("id","kw").send_keys("美女")
-
- driver.find_element("id","su").click()
-
- time.sleep(2)
-
- driver.find_element("id","1").click()
-
- time.sleep(2)
-
-
-
- print(driver.window_handles)
-
- print(driver.current_window_handle)
-
-
-
- #需要切换页面,才可以进行查找,下标从0开始,新打开的页面在所有handle列表的最后面
-
- driver.switch_to.window(driver.window_handles[1])
-
-
-
- time.sleep(2)
-
- #报错,因为没有进行网页切换
-
- driver.find_element_by_id"currentImg").click()
-
- time.sleep(1)
-
- driver.get_screenshot_as_file("img.png")
-
-
-
- time.sleep(3)
-
- driver.quit()
避免机器操作。
字母数字、旋转图片、拖动滑块等
测试环境下采用
生产环境下采用
通过Python-tesseract来识别图片类型验证码,识别率很难达到100%
测试其他外部网站需要,此项服务需要付费
通过记录cookie跳过登录(推荐)
01 Cookie的处理
浏览器和服务器通过cookie头机制,可以形成状态保持

方法:
eg:
- import time
-
- from selenium import webdriver
-
- driver = webdriver.Chrome('./chromedriver.exe')
-
- driver.get("https://www.baidu.com")
-
-
-
- driver.maxsize_window()
-
- time.sleep(5)
-
- #网页F12查看BDUSS,BAIDOID的值
-
- driver.add_cookie("name":'BDUSS',"value":'通过chrome浏览器调试工具查看')
-
- driver.add_cookie("name":'BAIDOID',"value":'通过chrome浏览器调试工具查看')
-
- time.sleep(5)
-
- driver.quit()
-
- time.sleep(2)
文件上传是比较常见的功能,上传功能操作webdriver并未提供对应方法
input标签处理思路:直接使用send_keys
- from selenium import webdriver
-
- ...
- #方法一:直接通过内部api上传,过程是看不见的
-
- driver.find_element_('id','username').send_keys('文件路径\文件名') #文件的绝对路径
-
- #方法二
-
- upload.send_keys('c:\\user\\administrator\\desktop\\smt.txt')
-
- ...
eg百度搜索提示:


元素比较不好找,可以先定位到对应的div再进去查看
ajax是异步请求,请求之后会局部更新,
- driver.get('https://www.baidu.com')
-
- driver.find_element('id', 'kw').send_keys('py')
-
- menus = driver.find_elements('class name', 'bdsug-overflow')
-
- for menu in menus:
-
- print(menu.text)
-
- menus[5].click() #点击其中一个