-
切换窗口:
driver.switch_to.window(handle)
如何获取handel?
通过driver.window_handles 方法获取当前浏览器所有窗口的handle
通过循环切换窗口判断标题的方法来确定当前窗口是否为目标窗口
保留当前窗口handle
driver.current_window_handle
关闭窗口的方法:driver.close()用于关闭当前窗口 -
对话框处理:
driver.switch_to.alter
1.alter :
点击确定:accept()
获取文本:text
2.confirm:
点击确定:accept()
获取文本:text
点击取消:dismiss()
3.prompt
点击确定:accept()
获取文本:text
点击取消:dismiss()
输入内容:send_keys()
from selenium import webdriver
import time
#alert
driver = webdriver.Chrome()
driver.get('file:///Users/wgz/Desktop/%E6%9D%BE%E5%8B%A4/%E8%87%AA%E5%8A%A8%E5%8C%96%E7%BB%83%E4%B9%A0/al.html')
driver.find_element_by_id('b1').click()
al = driver.switch_to.alert
time.sleep(3)
al.accept()
time.sleep(3)
#confirm
driver.find_element_by_id('b2').click()
al=driver.switch_to.alert
time.sleep(3)
al.accept()
time.sleep(3)
driver.find_element_by_id('b2').click()
al=driver.switch_to.alert
time.sleep(3)
al.dismiss()
time.sleep(3)
# prompt
driver.find_element_by_id('b3').click()
al = driver.switch_to.alert
time.sleep(3)
al.dismiss()
time.sleep(3)
driver.find_element_by_id('b3').click()
al = driver.switch_to.alert
time.sleep(3)
al.accept()
time.sleep(3)
driver.find_element_by_id('b3').click()
al = driver.switch_to.alert
time.sleep(3)
al.send_keys('hahaha')
time.sleep(3)
al.accept()
time.sleep(3)
driver.quit()
注意浏览器alter和普通html弹出框的区别
- 上传文件:
直接发送键盘消息给当前应用程序。
前提是浏览器必须是当前应用
此方法只在windows环境有用
pip install pypiwin32
获取shell对象
shell = win32com.client.Dispatch("Wscript.Shell")
有的系统要加'\r'
有的系统要加'\r\n'
使用shell对象的Sendkeys方法给应用程序发送字符串
shell.Sendkeys(r"d:\button.png"+'\n')
from selenium import webdriver
import time
driver = webdriver.Chrome(r'C:\Users\Win10\Desktop\chromedriver.exe')
driver.get('https://tinypng.com/')
driver.find_element_by_class_name('icon').click()
time.sleep(5)
import win32com.client
shell = win32com.client.Dispatch("WScript.shell")
shell.Sendkeys(r'C:\Users\Win10\Desktop\n.png'+'\n')
注意:输入法调成英文的,这个方法时发送字符串到当前的焦点程序,所以自动化时不要做其他操作。
- 滚动屏幕
如果窗口太长,改变窗口大小都不够,因为屏幕只有那么大,需要滚动到元素的方案,可以使用最后一招,直接让浏览器执行javascript脚本
浏览器执行的语言是js,如果我们能直接传入js让浏览器执行,
就得到了最大的灵活性去控制浏览器。
window.scroolBy(250,0)横向滚动250像素
让浏览器去执行
driver.execute_scrirt('window.scrollBy(250,0)')
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('http://news.baidu.com/')
#一边滑动一边查找元素---循环
#不知道滑动多少次---无限循环
while True:
driver.execute_script('window.scrollBy(0,200)')
#需要循环结束条件是找到目标元素
targeteles=driver.find_elements_by_css_selector('#guonei .l-left-col>ul:nth-child(1)>li:nth-child(1) a')
if targeteles:#如果找到了这个元素
targeteles[0].click()
break
driver.quit()
还可以使用键盘事件来完成该操作 注意先要获得页面焦点
from selenium import webdriver
import win32api
import win32con
driver=webdriver.Chrome()
driver.get('https://music.163.com/')
driver.switch_to.frame('g_iframe')
driver.find_element_by_css_selector('#discover-module .g-wrap3 .n-rcmd .v-hd2').click()
time.sleep(1)
#模拟向下滚动页面20次
for i in range(20):
win32api.keybd_event(win32con.VK_DOWN, 0)
time.sleep(0.5)
input('xxxxxxx')
driver.quit()
- 二次渲染
import time
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://localhost/mgr/ps/mgr/index.html#/')
def add_course():
#点击添加课程
driver.find_element_by_css_selector('[ng-click="showAddOne=true"]').click_element()
#输入课程名称
driver.find_element_by_css_selector('[ng-model="addData.name"]').send_keys('selenium课程')
#输入课程描述
driver.find_element_by_css_selector('[ng-model="addData.desc"]').send_keys('课程描述')
#输入展示次序
driver.find_element_by_css_selector('[ng-model="addData.display_idx"]').send_keys('1')
#点击创建
driver.find_element_by_css_selector('[ng-click="addOne()"]').click_element()
time.sleep(3)
def DeleteAllReacher(driver):
delButtons = driver.find_element_by_css_selector('*[ng-click^=delOne]')
for button in delButtons:
button.click()
driver.find_element_by_css_selector('.modal-footer .btn-primary').click()
if __name__ == '__main__':
delete_allCourse()#初始化-清除课程
add_course()
delete_allCourse()#清除动作-清除测试产生的数据
运行结果发现selenium.common.exceptions.SraleElementReferenceException: MEssage:stale element reference:element is not attached to the page document
原来是现在的web应用和以前大不相同,以前的web应用是直接残生最终的html界面
而现在,很多事页面加载完成后(也加载js前端代码),由前端代码动态改变界面的内容,比如从后端获取一些数据后,在动态改变界面的内容。
尤其是很多采用了框架像 angular ,react , vue 这些都会这样做。
这样就会有一个问题,开始的时候获取的html只是一个模版一样的文档,里面的数据没有产生,而是等前端js代码动态的再次向后端查询数据后,才动态的向html模版中填入数据或者修改数据;
原因是:一下子获取了多个删除按钮元素,然后用循环点击每个删除按钮但是当点击第一个按钮之后,页面有些部分被更新了,剩余的几个按钮,虽然看起来还是原来的样子,但是已经是新的界面元素了。
所以通过原来老得界面元素点击,就会出现这个错误
既然点击第一个课程的删除按钮后,页面部分被更新了,就只好重新获取界面元素。
def DeleteAllcourse(driver):
driver.implicitly_wait(2)
while True:
delbuttons = driver.find_elements_by_css_selector('*[ng-click^=delOne]')
if len(delButtons) < 1:
break
delButtons[0].click()
driver.find_element_by_scc_selector('.modal-footer .btn-primary').click()
time.sleep(1)
-
冻结窗口 js代码
setTimeout(function(){debugger},3000) -
模拟windows点击键盘
模拟Windows点击键盘
import win32com.client
需要先安装pypiwin32库,安装好了之后重启下pycharm,windows版本的默认安装好了
官方文档:http://timgolden.me.uk/pywin32-docs/win32api__keybd_event_meth.html
键盘对应参数:https://docs.microsoft.com/zh-cn/windows/desktop/inputdev/virtual-key-codes
import time
import win32api
import win32con
# shell = win32com.client.Dispatch("WScript.Shell")
#模拟5次下方向键
# for i in range(5):
# win32api.keybd_event(win32con.VK_DOWN, 0)
# time.sleep(0.5)
#模拟向下的按键
win32api.keybd_event(win32con.VK_DOWN,0)
#输入数字0
win32api.keybd_event(win32con.VK_NUMPAD0,0)
#模拟回车符号
win32api.keybd_event(win32con.VK_RETURN, 0)
#模拟空格
win32api.keybd_event(win32con.VK_SPACE, 0)
#模拟+
win32api.keybd_event(win32con.VK_ADD, 0)
- selenium 键盘事件
keys()类提供了键盘上几乎所有案件的方法。前面了解到,send_keys方法可以用来模拟键盘输入,除此之外,我们好可以用它来输入键盘上的案件,甚至是组合键如ctrl+A等
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
#输入框输入内容
driver.find_element_by_id('kw').send_keys('seleniumm')
#删除多输入的一个m
driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE)
#输入空格键+'教程'
driver.find_element_by_id('kw').send_keys(Keys.SPACE)
driver.find_element_by_id('kw').send_keys('教程')
#ctrl+a全选输入框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')
#ctrl + x剪切输入框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')
#ctrl+v 粘贴内容到输入框
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'v')
#通过回车来代替点击操作
driver.find_element_by_id('su').send_keys(Keys.ENTER)
driver.quit()
以下为常用的键盘操作:
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
- 鼠标事件
用selenium做自动化,有时候会遇到需要模拟鼠标操作曹能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等。而selenium给我们提供了一个类来处理这类事件--ActionChains
ActionChains提供了鼠标操作的常用方法:
perform(): 执行操作
context_click(): 右击
double_click(): 双击
drag_and_drop(): 拖动
move_to_element(): 鼠标悬停
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
above = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(above).perform()
time.sleep(3)
driver.quit()
网友评论