一、Selenium自动化测试框架
1.什么是框架?
2.为什么使用框架?
3.selenium的webdriver工作原理?
①脚本运行后,会打开指定浏览器,webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver的remote server,接收测试脚本的命令
②客户端(即测试脚本)通过ComandExecutor发送HTTP请求给Server
③webdriver通过浏览器的原生组件,转化Web Service的命令为浏览器的native的调用来完成操作
④用户操作Web Application的过程
4.安装selenium框架:pip install selenium==2.48.0(低版本较稳定)
二、Selenium API基础
1.浏览器驱动对象
①库的导入
from selenium import webdriver
②创建浏览器对象:driver = webdriver.xxx()
driver=webdriver.Firefox()
#谷歌浏览器需要导入chromedriver.exe驱动,驱动版本和浏览器版本一致
driver=webdriver.Chrome("路径\chromedriver.exe")
③浏览器尺寸的相关操作
#浏览器窗口最大化
driver.maximize_window()
#获取浏览器窗口尺寸
print(driver.get_window_size())
#设置浏览器窗口尺寸
driver.set_window_size(500,500)
④浏览器位置相关操作
#获取浏览器在屏幕显示的位置
print(driver.get_window_position())
#设置浏览器在屏幕显示的位置
driver.set_window_position(5,5)
⑤浏览器的关闭操作
#关闭当前窗口
driver.close()
#关闭所有窗口
driver.quit()
⑥页面请求操作
#访问url,获取响应
driver.get("https://www.baidu.com")
#刷新当前页面
driver.refresh()
#访问另一个url,获取响应
driver.get("https://www.taobao.com/")
#回退到百度的页面
driver.back()
#前进到之后的页面
driver.forward()
2.获取断言信息的操作
①获取当前页面url
print(driver.current_url)
②获取当前浏览器标题
print(driver.title)
③通过流截取当前页面
pic=driver.get_screenshot_as_png()
with open("baidu.png","wb") as f:
f.write(pic)
④直接截取当前页面
driver.get_screenshot_as_file("baidu.png")
⑤输出网页源码信息
print(driver.page_source)
3.元素定位(两种方式)
①直接调用型(推荐):driver.find_element_by_xxx(value)
#1.按id定位
findById=driver.find_element_by_id("kw")
findById.send_keys("12306")
#2.按name定位
findByName=driver.find_element_by_name("wd")
findByName.send_keys("10086")
#3.通过伪类名class定位
findByClass=driver.find_element_by_class_name("s_ipt")
findByClass.send_keys("4399")
#4.通过链接文本定位(必须是完整名称) link text
findByLinkText=driver.find_element_by_link_text("新闻")
findByLinkText.click()
#5.通过部分链接文本定位(模糊查询) partial link text
#若有多个符合匹配项,则执行从上到下从左到右的第一个
findByPartial=driver.find_element_by_partial_link_text("新")
findByPartial.click()
#6.xpath路径表达式
findByXpath=driver.find_element_by_xpath('//*[@id="kw"]')
submit=driver.find_element_by_xpath('//*[@id="su"]')
findByXpath.send_keys("刘耀文")
submit.click()
#7.css选择器定位
findByCss=driver.find_element_by_css_selector("#kw")
submit=driver.find_element_by_css_selector("#su")
findByCss.send_keys("邓紫棋")
submit.click()
#8.标签名定位(用的较少) tag name
#案例:必应搜索
driver.get("https://cn.bing.com")
findByTagName=driver.find_element_by_tag_name("input")
submit=driver.find_element_by_tag_name("circle")
findByTagName.send_keys("Ariana Grande")
submit.click()
②使用By类型(需先导入By):driver.find_element(By.xxx,value)
from selenium.webdriver.common.by import By
#通过By类型的id
findById=driver.find_element(By.ID,"kw")
findById.send_keys("测试")
4.元素的操作
三、Selenium API高级
1.多标签/窗口之间的切换
场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面,这种情况下,计算机需要识别多标签或窗口的情况
①获取所有窗口的句柄:handles = driver.window_handles
②通过窗口的句柄进入的窗口:driver.switch_to.window(handles[n])
2.多表单之间的切换
场景:在网页中,表单嵌套是很常见的情况,尤其是登录
①什么是多表单:实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看得到,简单理解就是页面中开了一个窗口显示另一个页面
②处理方法:
driver.switch_to.frame(id_value)
el = driver.find_element_by_xxx(el_value)
driver.switch_to.frame(el)
3.弹出框操作
#进入到弹出框
driver.switch_to.alert
#确认弹出框信息
driver.switch_to.alert.accept()
#取消弹出框信息
driver.switch_to.alert.dismiss()
#发送文本到弹出框
driver.switch_to.alert.send_keys(data)
4.滚动条操作
from selenium import webdriver
import time
driver=webdriver.Chrome("E:\PyCharm2021.3.3\pythonProject\selenium0425\Chrome\Application\chromedriver.exe")
driver.maximize_window()
#访问58
driver.get("https://bj.58.com/")
time.sleep(2)
#scrollTo(xpos,ypos),x坐标和y坐标,位于窗口左上角
#滚动条向下拉600xp
js="window.scrollTo(0,600)"
driver.execute_script(js)
time.sleep(2)
#滚动条回到最底部(两种方式)
bottom="window.scrollTo(0,document.body.scrollHeight)"
#bottom="var q=document.documentElement.scrollTop=10000"
driver.execute_script(bottom)
time.sleep(2)
#滚动条回到最顶部(两种方式)
top="window.scrollTo(0,0)"
#top="var q=document.documentElement.scrollTop=0"
driver.execute_script(top)
time.sleep(2)
#滚动到指定元素位置(最常用)
target=driver.find_element_by_xpath('//*[text()="IT|互联网"]')
driver.execute_script("arguments[0].scrollIntoView();",target)
5.鼠标操作
from selenium import webdriver
#导入动作链类,动作链可以储存鼠标的动作
from selenium.webdriver import ActionChains
import time
driver=webdriver.Chrome("E:\PyCharm2021.3.3\pythonProject\selenium0425\Chrome\Application\chromedriver.exe")
driver.maximize_window()
#访问百度
driver.get("https://www.baidu.com/")
time.sleep(2)
#定位到“更多”
more=driver.find_element_by_xpath('//*[text()="更多"]')
time.sleep(2)
#鼠标悬停在“更多”
ActionChains(driver).move_to_element(more).perform()
time.sleep(2)
#鼠标右击“更多”
ActionChains(driver).context_click(more).perform()
time.sleep(2)
#鼠标左击“更多”
ActionChains(driver).click(more).perform()
6.键盘操作
from selenium import webdriver
#键盘操作使用的是Keys类,一般配合send_keys使用
from selenium.webdriver.common.keys import Keys
import time
driver=webdriver.Chrome("E:\PyCharm2021.3.3\pythonProject\selenium0425\Chrome\Application\chromedriver.exe")
driver.maximize_window()
#访问百度
driver.get("https://www.baidu.com/")
time.sleep(2)
#定位到输入框
input_box=driver.find_element_by_id("kw")
input_box.send_keys("刘耀文2")
time.sleep(2)
#删除键(Backspace)
input_box.send_keys(Keys.BACK_SPACE)
time.sleep(2)
#回车键(Enter)
input_box.send_keys(Keys.ENTER)
7.等待
①强制等待:表示强行等待n秒再执行下一句代码,时间到了就会执行下个语句,但比较死板,不能保证在等待的时间内元素真正被加载了出来。而且如果等待的元素已经被加载出来,还需要等待时间结束才会执行下一句,浪费时间
②隐式等待:表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。这个方法的缺点是你需要的元素已经加载出来了,但页面还没有加载完,再需要继续等待页面加载完才能执行下一步操作。
③显式等待:显示等待明确要等到某个元素的出现,在设置时间内每隔x秒去判断一下指定的元素是否加载完,加载完了就执行下一步,否则继续每隔x秒去判断,直到时间截止。如果超时就会抛出异常。
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time,unittest
class TestWaitClass(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver = webdriver.Chrome("E:\PyCharm2021.3.3\pythonProject\selenium0425\Chrome\Application\chromedriver.exe")
cls.driver.maximize_window()
#访问百度
cls.driver.get("https://www.baidu.com/")
#隐式等待
# cls.driver.implicitly_wait(30)
def test001(self):
driver=self.driver
#强制等待
# time.sleep(10)
#显式等待
WebDriverWait(driver,10,1).until(EC.presence_of_element_located((By.ID,"kw")))
#定位搜索栏
driver.find_element_by_id("kw").send_keys("如懿传")