1 元素的操作方法
常见元素操作方法:
1、元素.send_keys() ,元素的输入方法,针对input
2、元素.click(),点击元素方法,针对link(链接)
3、元素.clear(),清空元素的信息,针对input,在输入之前,需要清空操作,确保输入的信息是我们所需要的
4、实例
# 1、导包
from time import sleep
from selenium import webdriver
# 2、实例化浏览器对象:类名()
driver = webdriver.Chrome()
# 3、打开网页包含协议头
driver.get('https://www.baidu.com/')
# 4、实施操作
# ele1= driver.find_element('id','s_kw_wrap').clear() ## 清空输入框
ele2 = driver.find_element('id','kw').send_keys('selenium自动化') # 输入检索数据
ele = driver.find_element('id','su').click() # 点击操作,查看检索结果
sleep(3)
# 5、关闭网页
driver.quit()
2 浏览器操作模块
1、导入webdriver模块:from selenium import webdriver
2、实例化浏览器:driver = webdriver.Chrome()
3、常见浏览器操作方法
浏览器操作动作 | 说明 |
---|---|
driver.maximize_window() | 最大化浏览器 |
driver.minimize_window() | 最小化浏览器 |
driver.set_window_size(w,h) | 设置浏览器大小 单位像素 |
driver.set_window_position(x,y) | 设置浏览器位置 |
driver.current_url | 获取当前页面url信息 |
driver.title | 获取当前页面title信息 |
driver.get_cookie | 获取cookie |
driver.get_cookies | 获取所有cookie |
driver.delete_all_cookies() | 删除所有cookie |
driver.delete_cookie() | 删除指定cookie |
driver.get_window_position | 获取窗口位置 |
driver.get_window_rect | 获取窗口矩形 |
driver.get_window_size | 获取窗口大小 |
driver.back() | 后退操作 |
driver.forward() | 前进操作 |
driver.refrensh() | 刷新操作 |
driver.close() | 关闭当前主窗口(主窗口:默认启动那个界面,就是主窗口) |
driver.quit() | 关闭driver对象启动的全部页面 |
4、实例
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.maximize_window() # 窗口最大化
sleep(1)
driver.set_window_size(1000, 1000) # 设置浏览器宽,高
sleep(1)
driver.set_window_position(200, 200)# 设置窗口浏览器位置
sleep(3)
driver.quit()
3 键盘操作模块
1、导入键盘模块的包:from selenium.webdriver.common.keys import Keys
2、send_keys()常用于模拟键盘输入,也可以用于输入键盘上
的按键,甚至是组合键,如 Ctrl+a、Ctrl+c 等(不区分大小写)。
表达式 | 说明 |
---|---|
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,‘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.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
# 模拟按下Ctrl+A键
ActionChains(driver).key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()
driver.find_element_by_xpath(“xpath”).send_keys(Keys.ENTER)# 按下enter
driver.find_element_by_xpath(“xpath”).send_keys(“text”) # 键盘输入
4 鼠标操作模块
1、导入鼠标操作模块的包:from selenium.webdriver import ActionChains
2、鼠标操作模块的语法
# 1、链式写法
ActionChains(driver).动作1.动作2.perform()
# 2、分布执行写法
myaction=ActionChains(driver) # 实例化
myaction.动作1
myaction.动作2
myaction.perfrom()
3、常见的鼠标操作
动作 | 说明 |
---|---|
click(self,on_element=None) | 左键 |
context_click(self,_on_element=None) | 右键 |
double_click(self,on_element=None) | 双击 |
move_to_element(self,to_element) | 鼠标移动到某个元素(悬停) |
drag_and_drop(self,source,target) | 拖拽到某个元素然后松开 |
drag_and_drop_by_offset(self,source,xoffset,yoffset) | 拖拽到某个坐标然后松开 |
key_down(self,value,element=None) | 按下某个键 |
key_up(self,value,element=None) | 松开某个键 |
move_by_offset(self,xoffset,yoffset) | 鼠标从当前位置移动到某个坐标 |
move_to_element_with_offset(self,to_element,xoffsety,yoffset) | 移动到距某个元素(左上角坐标) 多少距离的位置 |
release(self,on_element=None) | 在某个元素位置松开鼠标左键 |
send_keys(self,*keys_to_send) | 发送某个键到当前焦点的元素 |
send_keys_to_element(self,element,*keys_to_send) | 发送某个键到指定元素 |
click_and_hold(self,on_element=None) | 按住左键不放 |
注意:selenium 框架虽然提供了 鼠标右键方法,但是没有提供选择右键菜单方法,需要选择邮件菜单,可以通过键盘快捷键操作实现
4、实际应用
from selenium.webdriver import ActionChains
#鼠标左键单击
driver.find_element_by_xpath(“xpath”).click()
# 鼠标右键单击:
Actions(driver).context_click(driver.find_element_by_xpath(“xpath”)).perform()
# 鼠标悬停:
Actions(driver).move_to_element(driver.find_element_by_xpath(“xpath”)).perform()
# 鼠标拖拽:
Actions(driver).drag_and_drop(source, target).perform()
5 选择Select操作模块(下拉框)
1、导入select模块:from selenium.webdriver.support.select import Select
2、方法说明
select_by_visible_text('男生') # 显示的文本定位
select_by_value('张三') # value的属性值定位
select_by_index(0) # 通过索引定位
deselect_all() # 反选所有
3、实例
页面
<select id="fruit">
<option value="apple">苹果</option>
<option value="banana">香蕉</option>
<option value="orange">橙子</option>
</select>
定位:
from selenium import webdriver
from selenium.webdriver.support.ui import Select
# 创建一个Chrome浏览器实例
driver = webdriver.Chrome()
# 打开网页
driver.get("http://example.com")
# 定位下拉框元素
element = driver.find_element_by_id("fruit")
# 将定位到的元素转换成Select类型
select = Select(element)
# 通过value属性选择选项
select.select_by_value("banana")
# 关闭浏览器
driver.quit()
6 截图操作模块
语法:driver.get_screenshot_as_file(imgepath)
, imagepath:图片保存的目录地址及文件名称
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('selenium')
# 截图方法,建议使用png格式 , ./为当前路径, ../为上一级路径
driver.get_screenshot_as_file('./info.png')
sleep(3)
driver.quit()
7 三种等待
等待:页面元素全部加载出来时,元素才能正常定位,如果不等待,那么可能出现定位的元素还没加载出来,从而定位失败
三种等待
1、强制等待sleep:在代码中设置一个固定的等待时间,无论页面是否加载完成都会等待一段时间后继续执行下一步操作。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
time.sleep(10) # 强制等待10秒
element = driver.find_element_by_id("kw")
2、显式等待WebDriverWait:针对单个元素生效,在规定的时间内找到元素,找到了就执行下一步,没有找重新查找,直到超时则抛出异常(TimeoutException)。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
wait = WebDriverWait(driver, 10) # 设置显式等待时间为10秒
element = wait.until(EC.presence_of_element_located((By.ID, "kw")))
3、隐式等待 implicitly_wait:针对全局元素生效,在代码中设置一个等待时间,如果在规定时间内页面加载完成,则继续执行下一步操作,否则等待时间结束后抛出异常。
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
# 1、获取浏览器驱动对象
driver.get('www.baidu.com')
# 2、窗口最大化
driver.maximize_window()
# 3、设置隐式等待10s
driver.implicitly_wait(10)
ele = driver.find_element_by_id('kw')
ele.send_keys('zhangyisan')
sleep(3) # 强制等待
driver.quit()
8 js操作模块(系统弹框处理,滚动条拉动)
1、系统弹框处理:使用js实现
2、滚动条处理:使用js实现
滚动条处理步骤:
1、设置操作滚动条的操作语句:js_down="window.scollTo(0,1000)"
,0表示左边距(水平滚动条),1000表示上边距(垂直滚动条)
2、调用执行js方法,把设置js语句传入方法中:driver.execute_script(js_down)
实例
"""
滚动条:selenium中没有滚动条方法,需要js代码实现
1、准备js代码:"window.scrollTo(0, 1000)"
2、执行js代码:driver.execute_script(js的变量)
"""
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('www.test.coml')
sleep(2)
# 1、准备js代码
js_down = "window.scrollTo(0, 1000)"
# 2、执行js代码
driver.execute_script(js_down)
sleep(3)
driver.quit()
9 三种切换(自定义弹出框处理)
1、 alert切换: driver.switch_to.alert.方法
自定义弹窗:前端代码封装
弹出框的三种形式:alert(警示)、confirm(确认)、prompt(提示)
处理弹出框的步骤:
1、需要切换到对话框:driver.switch_to.alert.方法
2、处理对话框
alert.text # 获取文本
alert.accept() # 接受alert,只能用这个
alert.dismiss() # 取消,alert,confirm,prompt都可用
实例:
from selenium import webdriverfrom time import sleep
from selenium.webdriver.common.alert import Alert
from selenium.webdriversupport.wait import WebDriverWait
from selenium.webdriversupport import expected conditions as EC
driver = webdriverChromel()
driver.get(r'www.test.com')
test flag = 5
if test flag==5.
# 稳定的切换
# 问题: 点击了alert之后立即去accept等操作,有可能会无法及时弹出alert, 如果定位不到元素,需要等待
driver.find_element(id', confirm).click()
sleep(2) #为了演示
alert = WebDriverWait(driver,5,0.5).until(ECalert_is_present())
alert.accept()
if test flag==4; #另外一种实现
driver.find_element(id , confirm').click)
sleep(2)
Alert(driver).accept0 #不展开
if test flag ==3:
driver.find_element(id, prompt ).click()
sleep(2)
driver.switch_to.alert.send_keys(helloworld) #输入无显示
sleep(2)
driver.switch_to.alert.accept() #这里看到helloworld
if test flag ==2:
driverfind element(id', confirm').click()
sleep(2)
driver.switch_to.alert.dismiss() #输出你选择了取消
if test flag ==1:
driver.find element(id', alert').click()
sleep(2)
driver.switch_to.alert.accept()
2、frame和iframe 切换:
说明:frame和iframe的定位以及语法格式是一模一样的,此处只作frame介绍
识别frame-->devtools,console界面的top,frame
定位frame-->xpath定位法(需要切换到frame,一般可以获取到元素的信息,但是执行代码时无法定位,因此需要先切换到frame)
方法:
driver.switch_to.frame(frame_referrence)
# frame_referrence一般为
# --frame元素的id属性的值(如果存在)
# --frame元素的name属性的值(如果存在)
# --frame元素的索引(从0开始)
# --frame元素本身,即find_element得到的对象
driver.switch_to.parent_frame() # 父框架,相当于Linux下的 ..
drive.switch_to.default_content() # 默认的路径(主页面),相当好与Linux下的 ~,回到主页面的方法
示例:
一般的frame切换:frame切换/窗口切换 | 白月黑羽 (byhy.net)](https://www.byhy.net/tut/auto/selenium/frame/)
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 导入驱动 括号里可填驱动的具体路径
driver = webdriver.Chrome()
# 练习一
# 打开网页
driver.get("https://cdn2.byhy.net/files/selenium/sample2.html")
# 进入内嵌Frame
driver.switch_to.frame('innerFrame')
elements = driver.find_elements(By.CLASS_NAME, 'animal')
# 循环输出元素
for element in elements:
print(element.text)
# 再次返回到默认区域
driver.switch_to.default_content()
driver.find_element(By.ID, 'outerbutton').click()
show = driver.find_element(By.ID, 'add')
show1 = show.find_element(By.TAG_NAME, 'li')
print(show1.text)
# 关闭页面
driver.quit()
连续的frame切换:drive.switch_to.default_content()
"""
需要默认切换到frame
方法:driver.switch_to.default_content()
"""
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('www.example.com')
driver.switch_to.frame('idframe1')
driver.find_element_by_id('userA').send_keys('admin')
driver.switch_to.default_content()
driver.switch_to.frame('myframe2')
driver.find_element_by_id('userB').send_keys('admin4')
sleep(3)
driver.quit()
3、windows切换:
切换方法:每一个窗口都有唯一的窗口句柄值,可以通过句柄来切换
driver.switch_to.window(window_name) #切换窗口
driver.current_window_handle # 获取当前窗口的句柄
driver.window_handles #获取当前由driver启动所有窗口句柄
举例:
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driverget(http://12141.14.39:8088/index.html)
first win = driver.current window handle #比如要保留的是第一个窗口,那就记录下来sleep(2)
driver.execute script(window.open(https://www.baidu.com")#打打开新的窗
cur wins = driver.window handles #当前的所有货
driver.switch to.window(cur winsl-1)#切换到新的窗(假设就是2个窗口,多个要遍历,而目新开的就在最后sleep(2)
driver.close0) #切换过去后关闭掉
driver.switch to.window(first win) #切换到你要保留的那个窗
print(driver.current url)driver.find element( id',username').send keys('123')
10 文件上传
1、input标签的文件上传:使用send_keys
2、非input标签的文件上传
- pywinauto 方法
from pywinauto.keyboard import send_keys
time.sleep(3)
send_keys(r'd:\1.png')
send_keys({VK_RETURN}) # 回车操作符号
- pywin32 方法
import pywin32com.client
sh = win32com.client.Dispatch('WScript.shell')
time.sleep(3)
sh.SendKeys(r'd:\1.png'+'\n')
- pyautogui方法
from pywinauto.keyboard import send_keys
time.sleep(3)
send_keys(r'd:\1.png')
send_keys({VK_RETURN}) # 回车操作符号
11 截图
截图方法:driver.get_screenshot_as_file(imgepath)
,imgpath为截图保存的路径
举例:
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('张大仙')
# 截图方法,建议使用png格式 , ./为当前路径, ../为上一级路径
driver.get_screenshot_as_file('./info.png')
sleep(3)
driver.quit()
网友评论