功能 | 实现方式 |
---|---|
获取页面title | driver.title |
获取当前页面的url | driver.current_url |
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://wenku.baidu.com/') #百度文库首页
title = driver.title #获取页面title
print(title) #打印title
url = driver.current_url #获取当前页面的url
print(url) #打印url
功能 | 实现方式 |
---|---|
前进 | driver.forward() |
后退 | driver.back() |
刷新 | driver.refresh() |
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://yuedu.baidu.com/book/list/0') #百度阅读-分类
time.sleep(3)
driver.find_element_by_css_selector("a[class='nav-index']>span").click() #点击首页
time.sleep(3)
driver.back() #后退,回到分类界面
time.sleep(3)
driver.forward() #前进,回到首页
time.sleep(3)
driver.refresh() #刷新,首页刷新
功能 | 实现方式 |
---|---|
窗口最大化 | driver.maximize_window() |
自定义置窗口尺寸 | driver.set_window_size(1200,800) 设置自定义窗口宽1200,高800,从左上角开始 |
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://yuedu.baidu.com/book/list/0') #百度阅读-分类
time.sleep(3)
driver.maximize_window() #窗口最大化
time.sleep(5)
driver.set_window_size(1200,800) #设置自定义窗口宽1200,高800,从左上角开始
功能 | 实现方式 |
---|---|
输入框输入内容 | .send_keys() |
清空内容 | .clear() |
点击 | .click() 所有控件都可以点击,只是有些控件点击后没有效果而已 |
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://yuedu.baidu.com/') #百度阅读首页
driver.maximize_window() #窗口最大化
time.sleep(3)
driver.find_element_by_id('s-word-1').send_keys('软件测试') #在输入框中输入软件测试
time.sleep(3)
driver.find_element_by_id('s-word-1').clear() #清空输入框
time.sleep(3)
driver.find_element_by_id('s-word-1').click() #点击输入框
功能 | 实现方式 |
---|---|
判断定位的控件是否已经显示/加载出来 | .is_displayed(),返回布尔类型 |
获取输入框的尺寸(长宽) | .size ,返回一个字典类型 |
获取输入框中回显的值 | .get_attribute(‘value’) |
获取文本信息 | .text |
获取某项属性值 | .get_attribute(‘href’),()中填入属性名 |
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://yuedu.baidu.com/') #百度阅读首页
driver.maximize_window() #窗口最大化
time.sleep(3)
#判断定位的控件是否已经显示/加载出来了
dis = driver.find_element_by_class_name('s-submit').is_displayed()
print(dis) # 返回布尔类型,true或false
#获取输入框的尺寸(长宽),.size是个属性(property)方法,后面不需要加()
size = driver.find_element_by_id('s-word-1').size
print(type(size)) #获取size的类型,是一个字典类型
print(size) #获取size的值
print(size['height']) #获取输入框的高
#获取输入框中回显的值
driver.find_element_by_id('s-word-1').send_keys('软件测试') #输入框中输入软件测试
value = driver.find_element_by_id('s-word-1').get_attribute('value') #获取输入框中回显的值
print(value)
#获取我的书架的文本信息
text = driver.find_element_by_class_name('nav-right-mybook').text
print(text)
#获取我的书架的属性值,()中填入属性名
at = driver.find_element_by_class_name('nav-right-mybook').get_attribute('href')
print(at)
功能 | 实现方式 |
---|---|
鼠标移动到控件上 | ActionChains(driver).move_to_element(ele).perform() ,perform:使前面的动作生效 |
右击 | ActionChains(driver).context_click(ele).perform() |
双击 | ActionChains(driver).double_click(ele).perform() |
拖动 | ActionChains(driver).drag_and_drop(source,target) |
偏移 | ActionChains(driver).drag_and_drop_by_offset(source,100,0),将源控件往x=100,y=0偏移 |
from selenium.webdriver.common.action_chains import ActionChains #导入鼠标事件的类
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com') #百度首页
driver.maximize_window() #窗口最大化
time.sleep(3)
ele = driver.find_element_by_id('s-usersetting-top') #百度首页-设置
ActionChains(driver).move_to_element(ele).perform() #鼠标移动到ele上
time.sleep(3)
ActionChains(driver).context_click(ele).perform() #右击
ActionChains(driver).double_click(ele).perform() #双击
source = driver.find_element_by_link_text('新闻') #源控件
target = driver.find_element_by_link_text('地图') #目标控件
ActionChains(driver).drag_and_drop(source,target) #拖动:将源控件拖动到目标控件
ActionChains(driver).drag_and_drop_by_offset(source,100,0) #偏移:将源控件往x=100,y=0偏移
功能 | 实现方式 |
---|---|
回退 | .send_keys(Keys.BACK_SPACE) |
全选 | .send_keys(Keys.CONTROL,‘a’) |
复制 | .send_keys(Keys.CONTROL,‘c’) |
粘贴 | .send_keys(Keys.CONTROL,‘v’) |
剪切 | .send_keys(Keys.CONTROL,‘x’) |
from selenium.webdriver.common.keys import Keys #导入键盘事件的类
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://yuedu.baidu.com/') #百度阅读首页
driver.maximize_window() #窗口最大化
time.sleep(3)
driver.find_element_by_class_name('s-word').send_keys('软件测试') #输入框中输入内容
#使用方法:类名.变量名,变量名可进入类里面查看
driver.find_element_by_class_name('s-word').send_keys(Keys.BACK_SPACE) #回退——键盘上的退格键
time.sleep(3)
driver.find_element_by_class_name('s-word').send_keys(Keys.CONTROL,'a') #Crtl+A 全选
time.sleep(3)
driver.find_element_by_class_name('s-word').send_keys(Keys.CONTROL,'c') #Crtl+C 复制
time.sleep(3)
driver.find_element_by_class_name('s-word').click()
time.sleep(3)
driver.find_element_by_class_name('s-word').send_keys(Keys.CONTROL,'v') #Crtl+V 粘贴
time.sleep(3)
driver.find_element_by_class_name('s-word').send_keys(Keys.CONTROL,'x') #Crtl+X 剪切
等待时间一般适用于页面跳转时,有三种等待方式
功能 | 实现方式 | 说明 |
---|---|---|
强制等待 | time.sleep(3) | 强制等待3秒,需要导入time模块 |
显式等待 | WebDriverWait(driver,15,0.5).until(EC.presence_of_all_elements_located( (By.ID,“s-usersetting-top”))) | 最大等待15秒,每隔0.5秒检测1次,直到当前页面已经加载出来了对应控件,需要导入3个类 |
隐式等待 | driver.implicitly_wait(10) | 可允许加载的最长时间,如果下面加载的控件提前加载出来了,程序继续往下走 |
Unti和Until not应用场景
显示等待时间需要导入以下3个类
#显示等待时间需要导入以下3个类
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
driver = webdriver.Chrome()
import time #强制等待需要导入的time模块
time.sleep(3) #强制等待3秒
driver.implicitly_wait(10) #隐式等待时间,可允许加载的最长时间,如果下面加载的控件3秒就加载出来了,程序继续往下走
#显式等待时间
ele = WebDriverWait(driver,15,0.5).until(EC.presence_of_all_elements_located(
(By.ID,"s-usersetting-top"))) #最大等待15秒,每隔0.5秒检测1次,直到当前页面已经加载出来了对应控件,此处是by ID定位
ele = WebDriverWait(driver,15,0.5).until not(EC.presence_of_all_elements_located(
(By.ID,"s-usersetting-top"))) #直到当前页面不存在这个控件
功能 | 实现方式 | 说明 |
---|---|---|
打印当前的所有窗体信息 | print(driver.window_handles) | 一般是list形态 |
获取当前窗口句柄 | print(driver.current_window_handle) | |
窗体切换 | driver.switch_to.window(driver.window_handles[0]) | 切换到第1个窗体 |
关闭当前窗口 | driver.close() | |
关闭所有窗口 | driver.quit() |
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com') #百度首页
driver.maximize_window() #窗口最大化
driver.find_element_by_id('kw').send_keys('123') #输入框中输入123
driver.find_element_by_id('su').click() #点击搜索
print(driver.window_handles) #打印当前的所有窗体信息,一般是list形态
time.sleep(3)
driver.find_element_by_xpath("//div[@id='1']/h3[1]/a[1]").click() #点击一个链接
time.sleep(3)
print(driver.window_handles) #再次打印所有的窗体信息
print(driver.current_window_handle) #获取当前窗口句柄,即当前处于哪个窗口
driver.switch_to.window(driver.window_handles[0]) #窗体切换,切换到第1个窗体
driver.switch_to.window(driver.window_handles[1]) #窗体切换,切换到第2个窗体
driver.close() #关闭当前窗口
driver.quit() #关闭所有窗口,整个浏览器全部关掉
driver.switch_to.alert.send_keys('test') #向alert输入框输入内容
print(driver.switch_to.alert.text) #获取alet的文本内容
driver.switch_to.alert.accept() #点击正向按钮(确定、保存等)
driver.switch_to.alert.dismiss() #点击反向按钮(取消、不保存等)
driver.get_screenshot_as_file("G:/test.png") #截图保存到对应路径及名称,以.png结尾
Alert 界面下不能截图
#iframe
#第一种方式
driver.switch_to.frame('') #如果有id/name,且属性值不为空或不变,可以直接跟对应的属性值,就可以切到这个iframe里面
#要注意有时候id是动态可变的-后面加有时间戳的情况
#第二种方法-万能
dd = driver.find_element_by_xpath("") #先定位到这个iframe
driver.switch_to.frame(dd) #再切换到iframe里面去
driver.switch_to.parent_frame() #从子frame切回到父frame,如果有多个,需要多次切换
driver.switch_to.default_content() #切回主文档
注意
房间数是一个select标签,定位房间数时,下拉框会自动收起来,如果要定位下拉框的内容,定位方法如下:
#下拉框处理,有3种方法:text/index/value
from selenium import webdriver
from selenium.webdriver.support.select import Select #对于select标签,需要导入select类
driver = webdriver.Chrome()
driver.get('https://www.ctrip.com') #进入携程官网
s = driver.find_element_by_id('J_roomCountList') #先定位到下拉选择框
Select(s).select_by_visible_text('5间') #通过text:visible_text表示页面可见的文本信息
Select(s).select_by_index(3) #通过index:从下标0开始算起,此处选择的是4间房
Select(s).select_by_value('5') #通过value:直接传入value值,value值是一个字符串
时间控件展开去定位基本无法定位到(时间会自动收起)
#时间控件是input标签,展开无法定位
ele = driver.find_element_by_id('') #先定位到时间控件
ele.clear() #将时间输入框中的默认时间清除掉
ele.send_keys('2020-08-09') #将想要选择的时间输入进去,格式需要符合要求,且时间需要是今天及其以后
时间控件是input标签,但是有readonly属性,此时无法输入,可通过js代码定位,主要思路是先将只读属性移除,再输入内容
场景 | 定位方法 | 说明 |
---|---|---|
如果时间控件有id属性 | 使用id定位 | |
如果时间控件有name属性 | 使用name定位,ByName需要使用getElements,没有getElement使用方法 | 使用name定位到的是一组符合条件的控件,需要使用下标区分,下标从0开始 |
如果没有id,也没有name | 使用TagName定位 | 所有控件都有标签类型(TagName) |
#时间控件是input标签,但是有readonly属性,此时无法输入,可通过js代码定位
#document:html代码就是一个document树
#removeAttribute('readonly'):调用js的一个方法,将readonly属性移除
#1、如果时间控件有id属性
js = "document.getElementById('noticeEndTime').removeAttribute('readonly')"
#2、如果时间控件有name属性,ByName需要使用getElements,没有getElement使用方法
#使用name定位到的是一组符合条件的控件,需要使用下标区分,下标从0开始
js = "document.getElementsByName('noticeEndTime')[0].removeAttribute('readonly')"
#3、如果没有id,也没有name,可使用TagName定位(所有控件都有标签类型)
js = "document.getElementsByTagName('input')[0].removeAttribute('readonly')"
driver.execute_script(js) #执行js,就可以将readonly属性移除
driver.find_element_by_name('noticeEndTime').send_keys('2020-08-09 13:25:23') #移除后可输入
如果想要将滚动条滚动到某一个位置,需要多次调试坐标(多次尝试)
场景 | 定位方法 |
---|---|
滚动到页面底部 | scrollTop=10000 |
滚回页面顶部 | scrollTop=0 |
滚动到页面的50% | scrollHeight*0.5 |
水平方向滚动50% | scrollWidth*0.5 |
相对当前坐标移动 | window.scrollBy(0,-200) |
移动到绝对坐标 | window.scrollTo(0,1500) |
#滚动到页面底部,可设置一个很大的值,此处设置的10000
#滚回页面顶部,scrollTop=0
#var q是定义的一个变量,去掉也可以
js = 'var q=document.documentElement.scrollTop=10000'
driver.execute_script(js) #执行js
#滚动到页面的50%,x方向不变,在y方向上滚动
driver.execute_script('window.scrollTo(0,document.body.scrollHeight*0.5)')
#水平方向滚动50%
driver.execute_script('window.scrollTo(0,document.body.scrollWidth*0.5)')
driver.execute_script('window.scrollBy(0,-200)') #相对当前坐标移动,scorllBy
driver.execute_script('window.scrollTo(0,1500)') #移动到绝对坐标,scrollTo
1) 通过接口请求,拿到对应验证码信息,自行学习
2) 注入cookies,可自行学习:http://www.bcbxhome.com/bcbxxy/forum.php?mod=viewthread&tid=295&highlight=%E9%AA%8C%E8%AF%81%E7%A0%81
3) 让开发配合把验证码设置成万能验证码(最实用,不论输入什么内容都能登录进去,不会验证验证码是否正确)