序: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.方法1 3、添加动作方法2 action.方法2 4、调用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("https://www.baidu.com/")
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用法:
官网文档:
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("https://www.baidu.com")
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("https://www.baidu.com/")
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_handles
self.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("子节点")