写点什么

Selenium 的鼠标操作

作者:IT学堂笔记
  • 2024-02-20
    湖北
  • 本文字数:2457 字

    阅读完需:约 8 分钟

Selenium的鼠标操作

 Web 自动化测试中不常用,但是偶尔有需要使用的方法。用少了,就容易忘记。所以还是存下来以备不时之需


在 Web 自动化场景中很多操作都很容易实现,往往小部分的方法使用频率不高。这样就需要搜索方法,我也是经常忘记这些方法是如何使用的。不如还是写下来做个记录,这样以后也可以让自己很快地查到使用方法。


所有的鼠标操作,引用的相同类 ActionChains

  • 鼠标悬停 Mouse hover

  • 鼠标右击 Right click

  • 鼠标双击 Double click

  • 鼠标拖拽 Drag and drop

  • 执行 JS 语句 Execute script


01

鼠标悬停

Mouse hover



在 web 页面中经常会遇到菜单会自动隐藏的情况,如果鼠标不能一直保持在菜单位置,二级菜单就无法被选中



首先确定思路是将第一层级结构的对象识别出来

接下来将能够显示的隐藏菜单进行识别,以下是通过代码实现将 Bing 网站...隐藏的菜单显示出来,并点击 MSN 的菜单信息


以下是代码展示

webdriverWait = WebDriverWait(driver,10)webdriverWait.until(EC.presence_of_element_located((By.ID,"dots_overflow_menu_container")))driver.find_element(By.ID,"dots_overflow_menu_container").click()time.sleep(3)driver.find_element(By.XPATH,"//li[@id='msn']/a").click()
复制代码


但是问题在于此方法并没有使用鼠标悬停的类,直接通过 click 方法就完成了操作,那么通过 ActionChains 的类进行二次优化


  • 使用 move_to_element 的方法

  • 操作使用 perform()才能执行

webdriverWait = WebDriverWait(driver,10)webdriverWait.until(EC.presence_of_element_located((By.ID,"dots_overflow_menu_container")))Menu = driver.find_element(By.ID,"dots_overflow_menu_container")MSN_Menu = driver.find_element(By.XPATH,"//li[@id='msn']/a")act = webdriver.ActionChains(driver)act.move_to_element(Menu).move_to_element(MSN_Menu).click().perform()
复制代码


02

鼠标右击

Right Click



在某些时候会需要使用鼠标右键操作,很多菜单项都嵌入到了右键中。如何使用右键,Selenium 也集成了这部分的功能

Menu = driver.find_element(By.XPATH,"//div[@id='s-top-left']/a[text()='贴吧']")act = webdriver.ActionChains(driver)act.context_click(Menu).perform()
复制代码


  • 使用 context_click 的方法实现鼠标右键的操作

  • 然后使用 perform()



03

鼠标双击

Double Click



先找个能够使用 double click 的 URL: https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_ev_ondblclick3



Copy Text 的操作就需要使用双击才能实现

使用 double_click(element_name).perform()

代码如下:    

driver.switch_to.frame("iframeResult")button = driver.find_element(By.XPATH,"//button[text()='Copy Text']")act = webdriver.ActionChains(driver)act.double_click(button).perform()
复制代码


04

鼠标拖拽

Drag and Drop


在 web 页面中拖拽的操作很少,大部分的使用都是根据菜单或者快捷方式都能够实现,但是有时候又会有一些开发工程师喜欢做一些炫酷的操作,使用拖拽来实现


反而在移动端测试会使用到拖拽的操作。

拖拽的操作大致可以分为以下几类:

  • drag_and_drop(source_elem,target_elem)

  • drag_and_drop_by_offset(source_elem,x,y)


以上方法最大的问题是不稳定,操作的时候容易失败。如果使用的时候可以先尝试页面的 H5 结构是否可以使用以上的方法,如果有问题可以尝试以下的优化方法


  • click_and_hold(source_elem).pause(3).move_by_offset(x,y).pause(2).release().perform()

坐标 x,y 可以输入,建议各位按照页面的相对坐标以及对象元素的坐标进行计算后再进行操作

source = driver.find_element(By.XPATH, '//div[@id='dhtmlgoodies_listOfItems']//li[text()='Student A']')target = driver.find_element(By.XPATH, '//p[text()='Team B']/../ul')act = webdriver.ActionChains(driver)x1,x2 = (source.location['x'], source.location['x']+source.size['width'])y1,y2 = (source.location['y'], source.location['y']+source.size['height'])print(x1,x2,y1,y2)source_mid_x = (x1+x2)/2source_mid_y = (y1+y2)/2x3,x4 = (target.location['x'], target.location['x']+target.size['width'])y3,y4 = (target.location['y'], target.location['y']+target.size['height'])target_mid_x = (x3+x4)/2target_mid_y = (y3+y4)/2print(x3,x4,y3,y4)x = target_mid_x - source_mid_x + 50y = target_mid_y - source_mid_yact.click_and_hold(source).pause(3).move_by_offset(x, y).pause(2).release().perform()
复制代码


05

执行 JS 语句

Execute Script



在 web 页面中很多元素是不能被识别,有时候就需要使用 js 语句进行执行,最常见的操作有滚动条的滑动操作


我们在页面浏览或者查找列表信息的时候往往都需要对滚动条进行操作,以下是对滚动条的一些操作

以下方法仅仅是针对坐标值的点击滑动

driver.execute_script("window.scrollBy(0,3000)", "")value = driver.execute_script("return window.pageYOffset;")
复制代码


常常在实际使用中是需要查找到需要的文字或者图片以后才停止滑动操作,那么这样是如何实现的呢

案例是找到 China 的名字然后停止滑动

targetNames = driver.find_elements(By.XPATH, "//td[text()='China']")element = targetNames[0]js = "arguments[0].scrollIntoView();"driver.execute_script(js,element)
复制代码


我们需要根据 find_elements 进行所有的元素查找,然后找到唯一的值

通过 arguments[0].scrollIntoView 的 JS 语句进行查找

在使用滑动条的时候,会出现水平滑动跟垂直滑动的情况,以下的方法就是对应的方法

#向下滑动150个像素driver.execute_script("window.scrollBy(0, 150);")#向上滑动150个像素driver.execute_script("window.scrollBy(0, -150);")#向右滑动500个像素driver.execute_script("window.scrollBy(500, 0);")#向左滑动500个像素driver.execute_script("window.scrollBy(-500, 0);")
复制代码


有用但不常用的方法挺多的,根据项目的实际需求出发。然后按照项目特点进行平台化的封装使用,这样才可以更加有效的完成自动化测试工作。


发布于: 刚刚阅读数: 6
用户头像

还未添加个人签名 2020-02-12 加入

还未添加个人简介

评论

发布
暂无评论
Selenium的鼠标操作_IT学堂笔记_InfoQ写作社区