Selenium自动化测试框架
框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。
是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。
框架的优点:
1)自己从头实现太复杂
2)使用框架能够更专注于业务逻辑,加快开发速度
3)框架的使用能够处理更多细节问题
4)使用人数多,稳定性,扩展性好
webdriver工作原理
3.selenium环境搭建
1)python3.7
2)Firefox35(大于43的需要独立下载驱动)
3)selenium2框架 稳定版 2.48.0 (pip install selenium==2.48.0)
4)浏览器驱动
- Firefox:Releases · mozilla/geckodriver · GitHub
- chrome:chromedriver.storage.googleapis.com/index.html
- ie:selenium-release.storage.googleapis.com/index.html
- edge:Microsoft Edge WebDriver - Microsoft Edge Developer
Selenium-IDE
Selenium的IDE(集成开发环境)是一个易于使用的Firefox插件,用于开发Selenium测试案例。它提供了一个图形用户界面,用于记录使用Firefox浏览器,用来学习和使用Selenium用户操作。
from selenium import webdriver
diver=webdriver.Chrome(r"B:\admins\pyc\web0829\common\chromedriver.exe")
diver.maximize_window() #最大化
# print(diver.get_window_size()) #获取尺寸
# diver.set_window_size(500,500) #设置尺寸
# diver.get_window_position() #获取位置
# diver.set_window_position(50,50) #设置位置
# diver.close() #关闭当前标签页
# diver.quit() #关闭所有标签页
# diver.get('http://www.baidu.com') #请求url
# diver.get('http://zhuanlan.zhihu.com')
# diver.refresh() #刷新
# diver.back() #回退
# diver.forward() #前进
查看断言结果
from selenium import webdriver
diver=webdriver.Chrome(r"B:\admins\pyc\web0829\common\chromedriver.exe")
diver.maximize_window()
diver.get('http://zhuanlan.zhihu.com')
a=diver.current_url #获取url
b=diver.title #获取当前标题
c=diver.get_screenshot_as_png() #保存截图
d=diver.get_screenshot_as_file(filename=123) #保存截图
e=diver.page_source #网页源码
print(a,b,c,d,e)
from selenium import webdriver
from selenium.webdriver.common.by import By
diver=webdriver.Chrome(r"B:\admins\pyc\web0829\common\chromedriver.exe")
diver.maximize_window()
diver.get('http://www.baidu.com') #请求url
#元素定位
diver.find_element_by_id("kw").send_keys("paopao") #直接调用型
diver.find_element(By.ID,"su").click() #导入使用BY类型
from selenium import webdriver
diver=webdriver.Chrome(r"B:\admins\pyc\web0829\common\chromedriver.exe")
diver.maximize_window()
diver.get('http://www.baidu.com')
#元素定位八个方式
# diver.find_element_by_id("su")#id定位
# diver.find_element_by_name("wd")#name属性定位
# diver.find_element_by_class_name("s_ipt")#伪类名定位
# diver.find_element_by_tag_name("lm-new")#标签名定位
# diver.find_element_by_link_text("欢迎进入 百度一下,你就知道,盲人用户进入读屏幕模式请按快捷键Ctrl加Alt加R;阅读详细操作说明请按快捷键Ctrl加Alt加问号键。")#连接文本定位
# diver.find_element_by_partial_link_text("进入 百度一下,")#部分连接定位
# diver.find_element_by_xpath('//*[@id="hotsearch-content-wrapper"]/li[1]/a/span[2]')#xpath表达式定位
# diver.find_element_by_css_selector('#hotsearch-content-wrapper > li:nth-child(3) > a > span.title-content-title')#css_selector#表达式定位
from selenium import webdriver
diver=webdriver.Chrome(r"B:\admins\pyc\web0829\common\chromedriver.exe")
diver.maximize_window()
diver.get('http://www.baidu.com')
#元素的操作
# element=diver.find_element_by_id("kw").send_keys("selenium")#输入
# elements=diver.find_element_by_id("kw").clear() #清空输入框
# elementa=diver.find_element_by_id("kw").send_keys("python") #输入
# elementb=diver.find_element_by_id("su").click() #点击操作
多标签之间的切换 场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。
from selenium import webdriver
import time
diver=webdriver.Chrome(r"B:\admins\pyc\web0829\common\chromedriver.exe")
diver.maximize_window()
# diver.get('http://bj.58.com')
# diver.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a').click()
# handl=diver.window_handles
# diver.switch_to.window(handl[1])
# time.sleep(2)
# diver.find_element_by_link_text("顺义").click()
# diver.find_element_by_xpath('//*[@id="secitem-rent"]/dd/span/span[1]/input').send_keys(800)
# diver.find_element_by_xpath('//*[@id="secitem-rent"]/dd/span/span[3]/input').send_keys(1000)
# diver.find_element_by_xpath('//*[@id="secitem-rent"]/dd/span/span[5]/a').click()
多表单切换 在网页中,表单嵌套是很常见的情况,尤其是在登录的场景
from selenium import webdriver
diver=webdriver.Chrome(r"B:\admins\pyc\web0829\common\chromedriver.exe")
diver.maximize_window()
#表单切换
# diver.get('https://qzone.qq.com')
# bd=diver.find_element_by_id('login_frame')
# diver.switch_to.frame(bd)
# diver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
# diver.find_element_by_xpath('//*[@id="u"]').send_keys('3507532029')
# diver.find_element_by_xpath('//*[@id="p"]').send_keys('ffff.12332')
# diver.find_element_by_xpath('//*[@id="login_button"]').click()
from selenium import webdriver
diver=webdriver.Chrome(r"B:\admins\pyc\web0829\common\chromedriver.exe")
diver.maximize_window()
diver.get('http://www.baidu.com')
#弹出框操作
# diver.get("https://www.baidu.com")
# time.sleep(2)
# diver.find_element_by_xpath('//*[@id="s-usersetting-top"]').click()
# time.sleep(2)
# diver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]/span').click()
# time.sleep(2)
# diver.find_element_by_xpath('//*[@id="se-setting-3"]/span[2]/label').click()
# time.sleep(2)
# diver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()
# time.sleep(2)
# # diver.switch_to.alert.accept()
from selenium import webdriver
diver=webdriver.Chrome(r"B:\admins\pyc\web0829\common\chromedriver.exe")
diver.maximize_window()
# diver.get('http://bj.58.com')
# js='window.scrollTo(0,document.body.scrollHeight)'
# time.sleep(3)
# diver.execute_script(js)
# time.sleep(3)
# diver.execute_script('window.scrollTo(0,0)')
# time.sleep(3)
# tar=diver.find_element_by_css_selector('body > div.article > div.mainWrap > div.leftSide > div > div.fl.cbp2.cbhg > div.board.noBorder > a:nth-child(10)')
# diver.execute_script("arguments[0].scrollIntoView();", tar)
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
diver=webdriver.Chrome(r"B:\admins\pyc\web0829\common\chromedriver.exe")
diver.maximize_window()
# diver.get("https://www.baidu.com")
# el=diver.find_element_by_id("su")
# a=ActionChains(diver).context_click(el).perform
# b=ActionChains(diver).click(el).perform
# c=ActionChains(diver).move_to_element(el).perform
# diver.find_element_by_id("kw").send_keys(Keys.ENTER)
# diver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
# diver.find_element_by_id("kw").send_keys(Keys.TAB)
# diver.find_element_by_id("kw").send_keys(Keys.ESCAPE)
# diver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
# diver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
# diver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
# diver.find_element_by_id("kw").send_keys(Keys.CONTROL,'c')
强制等待
强行等待10s在执行下一句代码 这种等待方式时间到了就会执行下个语句,但比较死板,不能保证在等待的时间内元素真正被加载了出来。而且如果等待的元素已经被加载出来,还需要等待到时间才会执行下一句,浪费时间
导入定时等待库 from time import sleep 或者 import time
# #强制等待
# time.sleep(10)
隐式等待
这个等待表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。 这个方法的缺点是你需要的元素已经加载出来了,但页面还没有加载完,再需要继续等待页面加载完才能执行下一步操作。
注:隐式等待的作用域是全局,所以一般设置在整局代码的头几行。 隐式等待采用全部设置,也就是说,你所有的findElement方法都会最多等待30s
# #隐式等待
# diver.implicitly_wait(30)
显示等待
需要导入的包 from selenium.webdriver.support.wait import WebDriverWait #导入显性等待的包 from selenium.webdriver.support import expected_conditions as EC #判断所需要的元素是否已经被加载出来 from selenium.webdriver.common.by import By #定位 WebDriverWait类是由WebDirver 提供的等待方法。显示等待明确的要等到某个元素的出现,在设置时间内每隔x秒去判断一下指定的元素是否加载完,加载完了就执行下一步,否则继续每隔x秒去判断,指定时间截止。如果超时就会抛出异常。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# #显示等待
# WebDriverWait(diver,10,0,5).until(EC.presence_of_element_located((By.ID,"g-hu")))
强制等待、隐式等待和显式等待的区别:
强制等待:傻瓜式等待,不智能 隐式等待:全局通用,只需设置一次,很智能(等到了就走,不会浪费时间) 显式等待:等待元素处于特定条件的时候使用,很智能(等到了就走,不会浪费时间)