Selenium WebDriver Api 知识梳理

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

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

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

  5、多窗口切换
  有时候需要在不同的窗口切换,从而操作不同的窗口上的元素。但 WebDriver 提供了 switch_to.window()方法可以切换到任意的窗口。
  看如下代码
# FileName : Switch_to_frame.py
# Author   : Adil
# DateTime : 2018/3/13 17:49
# SoftWare : PyCharm
from selenium import webdriver
import time
driver = webdriver.Chrome()
# driver.implicitly_wait(1)
first_url = "http://www.hao123.com/"
driver.get(first_url)
time.sleep(1)
# 曾经支持的写法
# 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()
# 获取多窗口句柄
get_handles = driver.window_handles
print(get_handles)  #  ['CDwindow-(79057C598F9424652D25D8405B654717)', 'CDwindow-(99F2157CBA34CE7DAE131D3039561013)']
# 获取当前窗口句柄
get_currentHandle = driver.current_window_handle   # CDwindow-(79057C598F9424652D25D8405B654717)
print(get_currentHandle)
for handle in get_handles:
if handle != get_currentHandle:
# 最新写法 switch_to.window
driver.switch_to.window(handle)
# 曾经支持的写法
# driver.switch_to_window(handle)
print(driver.current_window_handle)
# 切换到初始frame
driver.switch_to.default_content()
time.sleep(2)
driver.find_element_by_xpath('//*[@id="menus"]/li[2]/a').click()
# 关闭当前句柄页
driver.close()
time.sleep(5)
# 关闭浏览器
driver.quit()
  6、警告框处理
  在 WebDriver 中处理 JavaScript 所生成的 alert、confirm 以及 prompt 是很简单的。具体做法是使用switch_to_alert()方法定位到 alert/confirm/prompt。然后使用 text/accept/dismiss/send_keys 按需进行操做。
  text:获取文本值
  accept() :点击"确认"
  dismiss() :点击"取消"或者叉掉对话框
  send_keys() :输入文本值 --仅限于 prompt,在 alert 和 confirm 上没有输入框
# 旧式写法
driver.switch_to_alert()
# 切换到Alter 弹出框上
driver.switch_to.alert()
# 同意点击确认
driver.switch_to.alert().accept()
# 取消操作
driver.switch_to.alert().dismiss()
# 输入文本内容
driver.switch_to.alert().send_keys("输入信息!")
  7、单选复选框操作
  7.1、单选: radio
  首先是定位选择框的位置
  定位 id,点击图标就可以了 ,即可完成单选的选择。
  7.2、复选框: checkbox
  勾选单个框,比如勾选 selenium 这个,可以根据它的 id=c1 直接定位到点击就可以了
  全部勾选,可以用到定位一组元素,从上面源码可以看出,复选框的type=checkbox,这里可以用 xpath 语法: .//*[@type='checkbox']
  这里注意,敲黑板做笔记了: find_elements 是不能直接点击的,它是复数的,所以只能先获取到所有的 checkbox 对象,然后通过 for 循环去一个个点击操作判断是否选中: 
is_selected()
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("file:///C:/Users/Gloria/Desktop/checkbox.html")
# 没点击操作前,判断选项框状态
s = driver.find_element_by_id("boy").is_selected()
print s
driver.find_element_by_id("boy").click()
# 点击后,判断元素是否为选中状态
r = driver.find_element_by_id("boy").is_selected()
print r
# 复选框单选
driver.find_element_by_id("c1").click()
# 复选框全选
checkboxs = driver.find_elements_by_xpath(".//*[@type='checkbox']")
for i in checkboxs:
i.click()
  8、select下拉框操作
  8.1、二次定位
  1.定位 select 里的选项有多种方式,这里先介绍一种简单的方法:二次定位
  2.基本思路,先定位 select 框,再定位 select 里的选项
  # 分两步:先定位下拉框,再点击选项
  s = driver.find_element_by_id('nr')
  s.find_element_by_xpath("//option[@value='50']").click()
  还有另外一种写法也是可以的,把最下面两步合并成为一步:
  driver.find_element_by_id("nr").find_element_by_xpath("//option[@valu
  e='50']").click()
  8.2、直接定位
  通过xpath或是css一次性直接定位到 option 上的内容
  driver.find.element_by_xpath(".//*[@id='nr']/option[2]").click()
  8.3、引入Select模块
  # 导入 select 模块 Select类
  from selenium.webdriver.support.select import Select
  select_by_index() :通过索引定位
  通过 select 选项的索引来定位选择对应选项(从 0 开始计数),如选择
  第三个选项:select_by_index(2)
  s = driver.find_element_by_id('nr')
  Select(s).select_by_index(2)
  select_by_value() :通过 value 值定位
  通过选项的 value值来定位。每个选项,都有对应的 value 值
  第二个选顷对应的 value 值就是"20":select_by_value("20")
s = driver.find_element_by_id('nr')
Select(s).select_by_value(20)
sl1 = Select(driver.find_element_by_id('cly_province'))
sl1.select_by_value('110000')
time.sleep(2)
#cly_city
sl1 = Select(driver.find_element_by_id('cly_city'))
sl1.select_by_value('110100')
time.sleep(2)
#cly_district
sl1 = Select(driver.find_element_by_id('cly_district'))
sl1.select_by_value('110105')
  select_by_visible_text() :通过文本值定位
  Select 模块里面还有一个更加高级的功能,可以直接通过选项的文本内容来定位。
  定位“每页显示 50 条” : select_by_visible_text("每页显示 50 条")
  s = driver.find_element_by_id('nr')
  Select(s).select_by_visible_text("每页显示50条")
  deselect_all() :取消所有选项
  deselect_by_index() :取消对应 index 选项
  deselect_by_value() :取消对应 value 选项
  deselect_by_visible_text() :取消对应文本选项
  first_selected_option() :返回第一个选项
  all_selected_options() :返回所有的选项
  9、文件下载和上传
  文件下载请参考 http://www.cnblogs.com/BlueSkyyj/p/7526803.html
  文件上传介绍两种方法,
  请参考:http://www.cnblogs.com/BlueSkyyj/p/7523821.html
  http://www.cnblogs.com/BlueSkyyj/p/7523844.html
  10、设置元素等待
  如今大多数的 web 应用程序使用 AJAX 技术。当浏览器在加载页面时,页面内的元素可能并不是同时被加载完成的, 这给元素的定位添加的困难 。 如因为在加载某个元素时延迟而造成ElementNotVisibleException 的情况出现,那么就会降低的自动化脚本的稳定性。
  WebDriver 提供了两种类型的等待:显式等待和隐式等待。
  10.1、显示等待
  显式等待使 WebdDriver 等待某个条件成立时继续执行,否则在达到最大时长时抛弃超时异常(TimeoutException)。
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver,5,0.5).until(
EC.presence_of_element_located((By.ID,"kw"))
)
element.send_keys('selenium')
driver.quit()
WebDriverWait()
  它是由 webdirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
  WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
  driver - WebDriver 的驱动程序(Ie, Firefox,Chrome 等)
  timeout - 最长超时时间,默认以秒为单位
  poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
  ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
  until()
  WebDriverWait()一般由 until()(或 until_not())方法配合使用,下面是 until()和 until_not()方法的说明。
  until(method, message=’ ’)
  调用该方法提供的驱动程序作为一个参数,直到返回值为 Ture。
  until_not(method, message=’ ’)
  调用该方法提供的驱动程序作为一个参数,直到返回值为 False。
  Expected Conditions
  在本例中,我们在使用 expected_conditions 类时对其时行了重命名,通过 as 关键字对其重命名为 EC,并调用 presence_of_element_located()判断元素是否存在。
  expected_conditions 类提供一些预期条件的实现。
  title_is 用于判断标题是否 xx。
  title_contains 用于判断标题是否包含 xx 信息。
  presence_of_element_located 元素是否存在。
  visibility_of_element_located 元素是否可见。
  visibility_of 是否可见
  presence_of_all_elements_located 判断一组元素的是否存在
  text_to_be_present_in_element 判断元素是否有 xx 文本信息
  text_to_be_present_in_element_value 判断元素值是否有 xx 文本信息
  frame_to_be_available_and_switch_to_it 表单是否可用,并切换到该表单。
  invisibility_of_element_located 判断元素是否隐藏
  element_to_be_clickable 判断元素是否点击,它处于可见和启动状态
  staleness_of 等到一个元素不再是依附于 DOM。
  element_to_be_selected 被选中的元素。
  element_located_to_be_selected 一个期望的元素位于被选中。
  element_selection_state_to_be 一个期望检查如果给定的元素被选中。
  element_located_selection_state_to_be 期望找到一个元素并检查是否选择状态
  alert_is_present 预期一个警告信息
  除了 expected_conditions 所提供的预期方法,我们也可以使用前面学过的 is_displayed()方法来判断元素是否可见
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
input_ = driver.find_element_by_id("kw")
element = WebDriverWait(driver,5,0.5).until(
lambda driver : input_.is_displayed()
)
input_.send_keys('selenium')
driver.quit()
  lambad 为 Python 创建匿名函数的关键字。关于 Python 匿名函数的使用这里不再进行讲解,请参考Python 相关教程。
  定义 input_为百度输入框,通过 is_displayed()判断其是否可见。
  10.2、隐式等待
  隐式等待是通过一定的时长等待页面所元素加载完成。哪果超出了设置的时长元素还没有被加载测抛NoSuchElementException 异常。WebDriver 提供了 implicitly_wait()方法来实现隐式等待,默认设置为 0。它的用法相对来说要简单的多。
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
input_ = driver.find_element_by_id("kw22")
input_.send_keys('selenium')
driver.quit()
  implicitly_wait()默认参数的单位为秒,本例中设置等待时长为 10 秒,首先这 10 秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不真对页面上的某一元素进行等待,当脚本执行到某个元素定位时,如果元素可定位那么继续执行,如果元素定位不到,那么它将以轮询的方式不断的判断元素是否被定位到,假设在第 6 秒钟定位到元素则继续执行。直接超出设置时长(10 秒)还没定位到元素则抛出异常。
  10.3、设置sleep休眠
  用 sleep()方法,需要说明的是 sleep()由 Python 的 time 模块提供。
  当执行到 sleep()方法时会固定的休眠所设置的时长,然后再继续执行。sleep()方法默认参数以秒为单位,如果设置时长小于 1 秒,可以用小数点表示,如:sleep(0.5)
from selenium import webdriver
import time
driver = webdriver.Chrome()
# driver.implicitly_wait(1)
first_url = "http://www.hao123.com/"
driver.get(first_url)
time.sleep(1)
  11、操作Cookie
  有时候我们需要验证浏览器中是否存在某个 cookie,因为基于真实的 cookie 的测试是无法通过白盒和集成测试完成的。WebDriver 提供了操作 Cookie 的相关方法可以读取、添加和删除 cookie 信息。
  webdriver 操作 cookie 的方法有:
  get_cookies() 获得所有 cookie 信息
  get_cookie(name) 返回有特定 name 值有 cookie 信息
  add_cookie(cookie_dict) 添加 cookie,必须有 name 和 value 值
  delete_cookie(name) 删除特定(部分)的 cookie 信息
  delete_all_cookies() 删除所有 cookie 信息
  下面通过 get_cookies()来获取当前浏览器的 cookie 信息
  下面贴上代码
# FileName : handleCookie.py
# Author   : Adil
# DateTime : 2018/3/17 19:38
# SoftWare : PyCharm
from selenium import webdriver
import time
url = 'https://www.yiyao.cc/'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
# 获取指定cookie的值
# cookie = driver.get_cookie()
cookies = driver.get_cookies()
print("登录前!")
print("cookies:")
print(cookies)
driver.find_element_by_id("new-username").clear()
driver.find_element_by_id("new-username").send_keys("username")
driver.implicitly_wait(5)
driver.find_element_by_id("new-password").clear()
driver.find_element_by_id("new-password").send_keys("password")
driver.find_element_by_id('home-right-login').click()
driver.implicitly_wait(5)
# 加一个休眠,这样得到的cookie 才是登录后的cookie,否则可能打印的还是登录前的cookie
time.sleep(5)
print("登录后!")
cookiesAfter = driver.get_cookies()
print("cookiesAfter:")
print(cookiesAfter)
print("cookie")
print(driver.get_cookie("domain"))
driver.add_cookie({'name':'yangyaojun','value':"yangpass"})
# 再次查看 cookies,打印出的信息是包含上面添加的内容的
print(driver.get_cookies())
driver.quit()
  delete_cookie() 和 delete_all_cookies()的使用也很简单,前者通过那么删除一个特定的cookie信息,后者直接删除浏览器中所有的cookies()信息。
  未完待续......
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号