1. 什么是框架
框架(framework)是一个框子 -- 指其约束性,也是一个架子 -- 指其支撑性,是一个基本概念上的结构,用于去解决或者处理复杂的问题。
2. 为什么使用框架
1)自己从头实现太复杂
2)使用框架能够更专注于业务逻辑,加快开发速度
3)框架的使用能够处理更多细节问题
4)使用人数多,稳定性,扩展性好
3. selenium工作原理
4.selenium对浏览器操作
1)库的导入
from selenium import webdriver
2)创建浏览器对象
# 必须为大写
driver = webdriver.Firefox()
driver = webdriver.Chrome()
3)浏览器尺寸相关操作
maximize_window() 最大化
get_window_size() 获取浏览器尺寸,打印查看
set_window_size() 设置浏览器尺寸,400*400
4)浏览器位置相关操作
get_window_position() 获取浏览器位置
set_window_position(x,y) 设置浏览器位置
5)浏览器的关闭操作
close()关闭当前标签/窗口
quit()关闭所有标签/窗口
6)页面请求操作
driver.get(url)请求某个url对应的响应
refresh()刷新页面操作
back()回退到之前的页面
forward()前进到之后的页面
fromselenium import webdriver
import time
# driver = webdriver.Chrome()#不可以找到,必须导入对应的驱动器
driver=webdriver.Firefox()
url1="http://www.baidu.com"
url2="https://zhuanlan.zhihu.com/"
# 请求第一个接口
driver.get(url1)
time.sleep(3)
# 刷新
driver.refresh()
driver.get(url2)
# 回退
driver.back()time.sleep(3)
# 前进driver.forward()
time.sleep(3)
driver.close()
5.selenium获取断言信息
1)什么是断言
断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。
2)获取断言信息的操作
current_url 获取当前访问页面url
title 获取当前浏览器标题
page_source 获取网页源码
print(driver.current_url)
print(driver.title)
print(driver.page_source)
get_screenshot_as_png() 保存图片
data=driver.get_screenshot_as_png()
withopen("a.png","wb")asf:
f.write(data)
get_screenshot_as_file(file) 直接保存
driver.get_screenshot_as_file("b.png")
6.selenium八大元素定位
from selenium import webdriver
driver=webdriver.Firefox()
# url = "http://www.baidu.com"
# driver.get(url)
# 第一种 id
# ele = driver.find_element_by_id("kw")
# ele.send_keys(12306) # 输入数据
# from selenium.webdriver.common.by import By
# ele = driver.find_element(By.ID,"kw")# ele.send_keys(12306) # 输入数据
# 第二种 标签名字
# ele = driver.find_element_by_name("wd")
# ele.send_keys(12306) # 输入数据
# 第三种 class
# ele = driver.find_element_by_class_name("s_ipt"
)
# ele.send_keys(12306) # 输入数据
# 第四种 Xpath
# ele = driver.find_element_by_xpath("//*[@id='kw']")
# ele.send_keys(12306) # 输入数据
# 第五种 css class
# ele = driver.find_element_by_css_selector("#kw")
# ele.send_keys(12306) # 输入数据
# 第六种 text
# ele = driver.find_element_by_link_text("地图")
# ele.click() # 输入数据
# 第七种:类似于模糊匹配
# ele = driver.find_element_by_partial_link_text("地")
# ele.click()
# 第八种:标签名定位,必须得保证只有一个这种名字的标签,使用下面这个搜索
# url = "http://cn.bing.com/"
# driver.get(url)# ele = driver.find_element_by_tag_name("input")
# ele.send_keys(12306) # 输入数据
7.元素的操作
对元素的相关操作,一般要先获取到元素,再调用相关方法
element = driver.find_element_by_xxx(value)
1)点击和输入
点击操作---------->element.click()
清空/输入操作:
element.clear()---------------------->清空输入框
element.send_keys(data)-------->输入数据
2)提交操作
element.submit()
8.多标签之间的切换
场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。
1)获取所有窗口的句柄
handles = driver.window_handlers
调用该方法会得到一个列表,在selenium运行过程中的每一个窗口都有一个对应的值存放在里面。
2)通过窗口的句柄进入的窗口
driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n])
通过窗口句柄激活进入某一窗口
案例:58同城租房信息:http://bj.58.com
# 使用句柄driver.get("http://bj.58.com")
print("点击之前句柄:",driver.window_handles)
ele=driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")ele.click()
list_windowns=driver.window_handles
print("点击之后句柄:",driver.window_handles)
driver.switch_to.window(list_windowns[1])
eleDaxing=driver.find_element_by_link_text("大兴")
eleDaxing.click()
9.多表单
el = driver.find_element_by_xxx(value)
driver.switch_to.frame(el)/driver.switch_to_frame(el)
案例:
from selenium import webdriver
#打开游览器
driver = webdriver.Firefox()
#登录QQ
url = "https://qzone.qq.com/"
driver.get(url)
#获取元素
#定位表单元素
ele_bd = driver.find_element_by_id("login_frame")
driver.switch_to.frame(ele_bd)
ele = driver.find_element_by_xpath(".//*[@id='switcher_plogin']")
ele.click()
#输入账号
ele2 = driver.find_element_by_id("u")
ele2.send_keys()
#输入密码
ele3 = driver.find_element_by_id("p")
ele3.send_keys("")
ele4 = driver.find_element_by_id("login_button")
ele4.click()
10. 弹出框操作
# 进入到弹出框中
driver.switch_to.alert
#接收警告
accept()
#解散警告
dismiss()
#发送文本到警告框
send_keys(data)
用法:driver.switch_to.alert.accept()
11. 下拉框
案例:
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
ele = driver.find_element_by_id("s-usersetting-top")
ele.click()
ele1 = driver.find_element_by_xpath(".//*[@id='s-user-setting-menu']/div/a[2]")
ele1.click()
time.sleep(2)
ele2 = driver.find_element_by_xpath(".//*[@id='yadv-setting-gpc']/div/div[1]/i[1]")
ele2.click()
list_ele = driver.find_elements_by_class_name("c-select-item")
print(list_ele)
list_ele[2].click()
# for list_i in list_ele:
# print(list_i.text)
# if list_i.text =="最近一周":
# list_i.click()
12. 鼠标和键盘操作
1. 鼠标
```jsx
1.先导入动作链类:
from selenium.webdriver import ActionChains
ActionChains(driver)
2.常用鼠标动作:
ActionChains(driver).context_click(ele).perform() 点击鼠标右键
ActionChains(driver). double_click(ele).perform() 点击鼠标左键
ActionChains(driver).move_to_element(el).perform() 鼠标悬停
3.perform()对前面的方法执行
#案例:
from selenium.webdriver import ActionChains
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
ele = driver.find_element_by_xpath(".//*[@id='s-top-left']/div/a")
# ele.click()
ActionChains(driver).double_click(ele).perform()
2. 键盘
```css
1.导入
from selenium.webdriver.common.keys import Keys
2.常用键盘操作
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,‘a’) 全选(Ctrl+A)
send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘 F1
send_keys(Keys.F12) 键盘 F12
13. 浏览器等待
1.为什么要进行等待
1.网速慢
2.网站内容过多
3.如果不进行等待而直接定位元素,可能会抛出异常
2.selenium中等待的分类
1.固定等待
2.显示等待
```css
WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(
(By.CLASS_NAME,"g-hu")))
```
3.隐式等待
```
driver.implicitly_wait(n)
```