Selenium WebDriver Api 知识梳理

发表于:2018-4-09 11:50

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Blue·Sky    来源:博客园

  之前一直没有系统的梳理WebDriver Api的相关知识,今天借此机会整理一下。
  1、页面元素定位
  1.1、8种常用定位方法
# id定位
driver.find_element_by_id()
# name定位
driver.find_element_by_name()
# className定位
driver.find_element_by_class_name()
# tag定位
driver.find_element_by_tag_name()
# link定位
driver.find_element_by_link_text()
# partial link定位
driver.find_element_by_partial_link_text()
# xpath定位
driver.find_element_by_xpath()
# css定位
driver.find_element_by_css_selector()
  1.2、实例
  以百度输入框为例如下图
# id定位
driver.find_element_by_id('kw')
# name定位
driver.find_element_by_name('wd')
# className定位
driver.find_element_by_class_name('s_ipt')
# tag定位
driver.find_element_by_tag_name('input')
  注意:由于name、class 、tag等不具有唯一性,所以不能区分不同的元素,所以很少使用。
  link 定位与前面介绍的几种定位方法有所不同,它专门用来定位本链接。百度输入框上面的几个文本链接的代码如下:
  <a class="mnav" name="tj_trnews" href="http://news.baidu.com">新闻</a>
  <a class="mnav" name="tj_trhao123" href="http://www.hao123.com">hao123</a>
  <a class="mnav" name="tj_trmap" href="http://map.baidu.com">地图</a>
  <a class="mnav" name="tj_trvideo" href="http://v.baidu.com">视频</a>
  <a class="mnav" name="tj_trtieba" href="http://tieba.baidu.com">贴吧>
  通过查看上面的代码,我们发现通过 name 属性定位是个不错的选择。不过我们这里为了要学习 link定位,通过 link 定位实现如下:
  find_element_by_link_text("新闻")
  find_element_by_link_text("hao123")
  find_element_by_link_text("地图")
  find_element_by_link_text("视频")
  find_element_by_link_text("贴吧")
  通过 partial link 定位如下:
  find_element_by_partial_link_text("一个很长的")
  find_element_by_partial_link_text("文本连接")
  find_element_by_link_text()方法通过元素标签对之间的部分文本信息来定位元素。
  xpath 、css定位
  # xpath定位
  driver.find_element_by_xpath('//*[@id="kw"]')
  # css定位
  driver.find_element_by_css_selector('#kw')
  通过 class 属性定位:
  find_element_by_css_selector(".s_ipt")
  find_element_by_css_selector(".bg s_btn")
  find_element_by_css_selector()方法用于 CSS 语言定位元素,点号(.)表示通过 class 属性来定位元素。
  通过 id 属性定位:
  find_element_by_css_selector("#kw")
  find_element_by_css_selector("#su")
  井号(#)表示通过 id 属性来定位元素
  1.3、定位一组元素
  WebDriver 还提供了与之对应的 8 种定位方法用于定位一组元素。
  find_elements_by_id()
  find_elements_by_name()
  find_elements_by_class_name()
  find_elements_by_tag_name()
  find_elements_by_link_text()
  find_elements_by_partial_link_text()
  find_elements_by_xpath()
  find_elements_by_css_selector()
  定位一组对象的方法与定位单个对象的方法类似,唯一的区别是在单词 element 后面多了一个 s 表示复数。
  定位一组对象一般用于以下场景:
  批量操作对象,比如将页面所有的复选框都被勾选。
  先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个。
  如下图通过 css 定位出一组元素,然后获取对应文本,判断是否是自己需要的,然后获取对应下标。
  fac_list = self.driver.find_elements_by_css_selector(".w220.ellipsis")
  for fac in fac_list:
  if fac.text == u'洛阳顺势药业有限公司':
  i = fac_list.index(fac)
  i = i+1
  break
  googs_path = ".//*[@id='search_result_list']/li[%d]/div/table/tbody/tr[1]/td[9]/p/a" % i
  time.sleep(5)
  以上完成了页面元素简单定位,当然这里只是最简单的举例,复杂的定位可以根据需要进行组合,当然也可以借助浏览器插件等工具,进行元素定位,如chrome 的开发者模式,firefox 的 firebug、firepath等工具
  2、浏览器操作
  2.1、控制浏览器大小
  # 设置浏览器大小
  driver.set_window_size(800,800)
  # 设置浏览器最大化
  driver.maximize_window()
  2.2、控制浏览器后退、前进、刷新
# FileName : setWindow.py
# Author   : Adil
# DateTime : 2018/3/12 16:48
# SoftWare : PyCharm
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(1)
first_url = "http://www.baidu.com/"
driver.get(first_url)
time.sleep(5)
# 设置浏览器大小
driver.set_window_size(800,800)
# 设置浏览器最大化
driver.maximize_window()
# 访问第二个页面
second_url = 'http://news.baidu.com/'
driver.get(second_url)
# 返回(后退)到百度首页
print("back to %s"%first_url)   # back to http://www.baidu.com/
driver.back()
# 前进到新闻页
print("forward to %s"% second_url)  # forward to http://news.baidu.com/
driver.forward()
time.sleep(5)
driver.refresh()
time.sleep(15)
driver.quit()
  2.3、浏览器滚动
  关于浏览器滚动条的滚动,之前,chrome与其他浏览器是不兼容的,参考 http://www.cnblogs.com/Skyyj/p/7275938.html
  今天尝试发现,chrome 与其他浏览器兼容了,改变了原有的写法。
  上下滚动统一支持如下写法
  # 滚动到底部
  js = "var q=document.documentElement.scrollTop=10000"
  driver.execute_script(js)
  time.sleep(5)
  # 然后滚动到上面
  js = "var q=document.documentElement.scrollTop=0"
  driver.execute_script(js)
  左右滚动
# 设置浏览器窗口大小,长500,高400
driver.set_window_size(500,400)
time.sleep(5)
# 设置横向滚动
js = 'window.scrollTo(500,400)'
driver.execute_script(js)
time.sleep(5)
  3、元素操作
  3.1、元素简单操作
  click()  单击、clear()清空、send_keys()文本框输入、submit()提交表单,模拟回车操作
  driver.find_element_by_id("idInput").clear()
  driver.find_element_by_id("idInput").send_keys("username")
  driver.find_element_by_id("pwdInput").clear()
  driver.find_element_by_id("pwdInput").send_keys("password")
  driver.find_element_by_id("loginBtn").click()
  3.2、鼠标事件
  ActionChains 类提供的鼠标操作的常用方法:
  perform() 执行所有 ActionChains 中存储的行为
  context_click() 右击
  double_click() 双击
  drag_and_drop() 拖动
  move_to_element() 鼠标悬停
# FileName : mouseSet.py
# Author   : Adil
# DateTime : 2018/3/12 18:32
# SoftWare : PyCharm
from selenium import webdriver
# import ActionChains
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
# driver.implicitly_wait(1)
first_url = "http://www.baidu.com/"
driver.get(first_url)
# 悬浮 move_to_element()
time.sleep(2)
driver.maximize_window()
time.sleep(2)
element1 = driver.find_element_by_xpath(".//*[@id='u1']/a[8]")
ActionChains(driver).move_to_element(element1).perform()
time.sleep(5)
# 右击 context_click()
ActionChains(driver).context_click(element1).perform()
time.sleep(5)
# 双击 double_click()
ActionChains(driver).double_click(element1).perform()
time.sleep(5)
# 拖动 drag_and_drop()
#定位元素的源位置
element = driver.find_element_by_name("xxx")
#定位元素要移动到的目标位置
target = driver.find_element_by_name("xxx")
#执行元素的拖放操作
ActionChains(driver).drag_and_drop(element,target).perform()
driver.quit()
  3.3、键盘事件
  from selenium.webdriver.common.keys import Keys
  在使用键盘按键方法前需要先导入 keys 类包。
  下面经常使用到的键盘操作:
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 import webdriver
#引入 Keys 模块
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
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(u"教程")
#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()
  4、多frame切换
  在 web 应用中经常会遇到 frame 嵌套页面的应用,页 WebDriver 每次只能在一个页面上识别元素,对于 frame 嵌套内的页面上的元素,直接定位是定位是定位不到的。这个时候就需要通过 switch_to_frame()方法将当前定位的主体切换了 frame 里。
  参看 hao123首页
# 曾经支持的写法
# driver.switch_to_frame("iframeu2872032_0")
# 最新写法
driver.switch_to.frame("iframeu2872032_0")
# 切换到该frame下,然后点击操作,到另一页面。
driver.find_element_by_xpath('//*[@id="container"]/div[3]/div/a').click()
# 切换到初始frame
driver.switch_to.default_content()
time.sleep(2)
driver.find_element_by_xpath('//*[@id="menus"]/li[2]/a').click()
  对于多层frame ,可以使用frame的索引切换
  driver.switch_to.frame(3)
  如果 iframe没有可用的id 和name属性,还可以使用xpath
# 先通过xpath定位到iframe
xf = driver.find_element_by_xpath('XXXX')
# 再将定位对象传给switch_to.frame(xf)
driver.switch_to.frame(xf)
...
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号