序:web自动化,除了需要定位网页元素外,在定位到元素后,一般都需要执行一系列操作,最常用的就是单击click,另外还包括输入文件、右键点击,页面滑动,表单操作等
selenium webdriver api指导文档:
https://selenium-python.readthedocs.io/api.html
selenium提供的操作接口:
ActionChains:执行PC端的鼠标点击,双击,右键,拖拽等操作
TouchActions:模拟PC和移动端的点击,滑动,拖拽,多点触控等多种手势操作
ActionChains用法:
包含的一些基本操作:
click(on_element=None):模拟左键点击,如果不传入element,那么点击鼠标当前位置
click_and_hold(on_element=None):点击并不释放
context_click(on_element=None):模拟右键点击
double_click(on_element=None):模拟双击
drag_and_drop(source, target):拖动然后移动到另外一个位置放下,传入两个元素,第一个元素位置和第二个元素位置
key_down
(value,element=None)
key_up
(value,element=None)
ActionChains执行原理
调用ActionChains的方法时,不会立即执行,而是将所有的操作,按顺序存放在一个队列里,当调用perform()方法时,才会以此执行基本用法:1、生成一个动作action = ActionChains(driver)2、添加动作方法1 action.方法13、添加动作方法2 action.方法24、调用action.perform()方法执行具体写法:1、链式写法ActionChains(driver).move_to_element(element).click(element).perform()2、分布写法action = ActionChains(driver)action.move_to_element(element)action.click(element)action.perform()
1、模拟点击、右键、双击等操作
element_click = self.driver.find_element_by_xpath('xpath')element_doubleclick = self.driver.find_element_by_xpath('xpath')element_rightclick = self.driver.find_element_by_xpath('xpath')action = ActionChains(self.driver)action.click(element_click)action.double_click(element_doubleclick)action.context_click(element_rightclick)sleep(3)action.perform()
2、模拟鼠标移动到某个元素上
def test_movetoelement(self):self.driver.get("/")self.driver.maximize_window()element = self.driver.find_element_by_xpath('//*[@id="u1"]/span')action = ActionChains(self.driver)action.move_to_element(element)action.perform()sleep(5)
3、模拟按键
模拟按键方法有多种:1、用win32api来实现 2、能用SendKeys来实现 3、能用selenium的webelement对象的send_keys()方法实现4、ActionChains类也提供了几个模拟按键的方法ActionChains用法介绍1、action = ActionChains(self.driver)2、action.send_keys(Keys.BACK_SPACE)3、或者action.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL)4、action.perform()
self.driver.get()element = self.driver.find_element_by_xpath("")element.click()action = ActionChains(self.driver)action.send_keys("username").pause(1)action.send_keys(Keys.SPACE).pause(1)action.send_keys("tom").pause(1)action.send_keys(Keys.BACK_SPACE).perform()
TouchActions用法:
官网文档:
https://www.selenium.dev/selenium/docs/api/py/webdriver/mon.touch_actions.html?highlight=touchactions
TouchAction类似与ActionChains,ActionChains只是针对PC端程序鼠标模拟的一系列操作,对h5页面操作是无效的TouchAction可以对h5页面操作,可以实现点击、滑动、多点触控、以及模拟手势的各种操作手势控制:tap---在指定元素上单击double_tap---在指定元素上双击tap_and_hold---在指定元素上点击但不释放move---手势移动指定偏移(不释放)release---释放手势scroll---手势点击并滚动scroll_form_element---从某个元素位置开始手势点击并滚动(向下滑动为负数,向上滑动为正数)long_press---长按元素flick---手势滑动flick_element---从某个元素位置开始手势滑动(向上滑动为负数,向下滑动为正数)perform---执行
class TestTouchActions:def setup(self):option = webdriver.ChromeOptions()option.add_experimental_option('w3c', False)self.driver = webdriver.Chrome(options=option)self.driver.implicitly_wait(5)self.driver.maximize_window()def teardown(self):self.driver.quit()def test_touchactions_scrollbutton(self):'''打开百度网页在搜索框中输入‘selenium’滑动到底部,点击下一页按钮关闭chorme浏览器'''self.driver.get("")ele = self.driver.find_element_by_id('kw').send_keys('selenium')ele_su = self.driver.find_element_by_id('su')action = TouchActions(self.driver)action.tap(ele_su)action.perform()# 滑动到底部action.scroll_from_element(ele_su, 0, 10000).perform()sleep(2)
表单操作
表单时一个包含表单元素的区域,是允许用户在表单中(如文本域、下拉列表、单选框、复选框等)输入信息的元素
表单使用表单标签(<form>)定义,例如 :<form><input/></form>
操作表单元素的步骤:
1、定位到表单元素
2、操作元素:清空,输入或者点击等
多窗口处理
当我们在网页上点击一个按钮,如果新开一个网页窗口去实现页面跳转,然后需要在新页面上操作,这种情况该如何处理
想在新页面上操作,就得先切换窗口,获取窗口的唯一标识用句柄表示,所以只需要切换句柄,就可以在多个页面灵活操作
多窗口处理方法:
1、先获取到当前的窗口句柄:driver.current_window_handle
2、再获取到所有窗口的句柄:driver.window_handles
3、判断是否是想要操作的窗口,如果是,就可以对窗口进行操作,如果不是,跳转到另外一个窗口:driver.switch_to.window,对另一个窗口进行操作
多窗口切换案例:打开百度页面,点击登录,在弹框中点击立即注册(打开一个新页面,在用户名处输入username),返回刚才的登录页面,点击用户名登录
def test_windows(self):self.driver.get("/")self.driver.find_element_by_xpath('//*[@id="u1"]/a').click()print(self.driver.current_window_handle)self.driver.find_element_by_link_text('立即注册').click()print(self.driver.window_handles)print(self.driver.current_window_handle)windows = self.driver.window_handlesself.driver.switch_to.window(windows[1])self.driver.find_element_by_id("TANGRAM__PSP_4__userName").send_keys("username")sleep(3)self.driver.switch_to.window(windows[0])self.driver.find_element_by_id('TANGRAM__PSP_11__footerULoginBtn').click()sleep(3)
网页frame处理
当一个网页里面有多个html页面组成时,比如网页内嵌,这时就会有多个frame,这种场景又该如何处理
在web自动化中,如果一个元素定位不到,那么很大可能是在iframe中
什么是frame:frame是html中的框架,在html中,所谓的框架就是可以在同一个浏览器中显示不止一个页面,基于html的框架,又分为垂直框架和水平框架(cols,rows)
frame分类:
frame标签包含frameset、frame、iframe三种,frameset和普通的标签一样,不会影响元素定位
而frame与iframe对selenium定位而言是一样的,selenium有一组方法可以对frame进行操作
frame的存在方式有两种:一种是嵌套的,一种是不嵌套的
切换frame:
driver.switch_to.frame() 根据元素id或者index切换frame
driver.switch_to.default_content() 切换到默认frame
driver.switch_to.parent_frame() 切换到父级frame
处理未嵌套的iframe:
driver.switch_to.frame(frame_id)
driver.switch_to.frame(frame_index) frame无id的时候根据索引来处理,索引从0开始,driver.switch_to_frame(0)
处理嵌套的iframe:
对于嵌套的先进入iframe的父节点,再进到子节点,然后可以对子节点里面的对象进行处理和操作
driver.switch_to.frame("父节点")
driver.switch_to.frame("子节点")
如果觉得《web自动化:web控件交互操作/多窗口处理/网页frame》对你有帮助,请点赞、收藏,并留下你的观点哦!