ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

自动化测试之WebDriver API

2022-07-02 16:35:02  阅读:138  来源: 互联网

标签:WebDriver name 定位 元素 driver element API 自动化 find


一、元素定位 

二、元素操作

三、浏览器操作

四、获取元素信息

五、鼠标和键盘操作

六、元素等待

七、下拉选择框、弹出框、滚动条操作

八、frame切换

九、多窗口切换

十、窗口截图

十一、验证码

十二、文件的上传

十三、定位一组元素

 


一、元素定位

  1、id 定位

  通过元素的id来查找元素,在html标准规范中ID值是唯一的。

  定位方法:find_element_by_id(id) # id参数表示的是id的属性值

# 定位百度输入框
driver.find_element_by_id("kw")
# 定位百度搜索按钮
driver.find_element_by_id("su")

  2、name 定位

  通过元素的name属性值为进行元素定位,name属性值在HTML页面中,是可以重复的。

  定位方法:find_element_by_name(name) # name 参数表示的是name的属性值

# 定位百度输入框
driver.find_element_by_name("wd")

  3、class 定位

  通过元素的class属性值进行元素定位,class属性值是可重复的。

  定位方法: find_element_by_class_name(class_name) # class_name参数表示的是class的其中一个属性值

# 定位百度输入框
driver.find_element_by_class_name("s_ipt")

  4、tag 定位

  通过元素的标签名称进行定位, 在同一个html页面当中,相同标签元素会有很多,默认定位第一个(不建议使用)。

  定位方法: find_element_by_tag_name(tag_name) #tag_name表示的是元素的标签名称

# 定位百度输入框
driver.find_element_by_tag_name("input")

  5、link 定位

  通过超链接的全部文本信息进行元素定位 ,主要用来定位文本链接。

  定位方法: find_element_by_link_text(link_text) # link_text参数代表的是a标签的全部文本内容

# 定位百度输入框上面的几个文字链接
driver.find_element_by_link_text("新闻")

  6、partial link 定位

  通过超链接的局部文本信息进行元素定位,主要用来定位文本链接。

<a class="m" name="t" href="#">一个文本链接</a>
# 通过部分文字定位链接
driver.find_element_by_partial_link_text("文本链接")

  7、XPath 定位

  1.绝对路径定位

driver.find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")

  2.利用元素属性定位

  //*或者//tag_name开头

  //*[@attribute='value'] # attribute表示的是元素的属性名,value表示的是元素对应属性值

driver.find_element_by_xpath("//input[@id='kw']")

  3.层级与属性结合

  //*或者//tag_name开头

  如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以查找其上一级元素。如果它的上一级元素有可以唯一标识属性的值,就可以拿来使用。

<form id="form" class="fm" action="/s" name="f">
     <span class="s_ipt_wr">
         <input id="kw" class="s_ipt" autocomplete="off" maxlength="100" name="wd"> 
     </span>
     <span class="s_btn_wr">
         <input id="su" class="bg s_btn" type="submit" value="百度一下">
     </span>
# span[@class='s_ipt_wr'] 通过 class 定位到父元素,后面的/input 表示父元素下面的子元素。
driver.find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")

  4.使用逻辑运算符

  //* 或者//tag_name 开头

  //*[@attribute1='value1' and @attribute2='value2']

  如果一个属性不能唯一区分一个元素,那么我们可以使用逻辑运算符连接多个属性来查找元素。

driver.find_element_by_xpath("//input[@id='kw' and @class='s_ipt']")

  5.使用 contains 方法

  //*[contains(@attribute,'value')] attribute表示的属性名称,value表示的是字符串

  contains 方法用于匹配一个属性中包含的字符串,要定位的元素中,attribute属性的属性值包含了value的内容。

  例如,span 标签的 class 属性为“bgs_ipt_wr”。
driver.find_element_by_xpath("//span[contains(@class,'s_ipt_wr')]/input")

  6.使用 text()方法

  //*[text() = 'value'] value表示的是要定位的元素的全部文本内容

driver.find_element_by_xpath("//a[text(),'新闻')]")

  8、CSS 定位

  CSS 选择器的常见语法如下所示。

  

  1.通过 class 定位

driver.find_element_by_css_selector(".s_ipt")

  2.通过 id 定位

driver.find_element_by_css_selector("#kw")

  3.通过标签名定位

driver.find_element_by_css_selector("input")

  4.通过标签层级关系定位

  查找 span 中所有标签名为 input 的子元素。

driver.find_element_by_css_selector("span > input")

  5.通过属性定位

driver.find_element_by_css_selector("[name='kw']")

  6.组合定位

driver.find_element_by_css_selector("form.fm > span > input.s_ipt")

  7.其他定位用法

查找 class 属性包含“s_ipt_wr”字符串的元素。

driver.find_element_by_css_selector("[class*=s_ipt_wr]")

查找 class 属性以“bg”字符串开头的元素。

driver.find_element_by_css_selector("[class^=bg]")

查找 class 属性以“wrap”字符串结尾的元素。

driver.find_element_by_css_selector("[class$=wrap]")

查找 form 标签下面第 2 个 input 标签的元素

driver.find_element_by_css_selector("form > input:nth-child(2)")

  8、用 By 定位元素

  在使用 By 之前需要先导入。

from selenium.webdriver.common.by import By

  定位方法:find_element(By. 定位的类型 . 定位的值)

driver.find_element(By.ID,"kw")
driver.find_element(By.NAME,"wd")
driver.find_element(By.CLASS_NAME,"s_ipt")
driver.find_element(By.TAG_NAME,"input")
driver.find_element(By.LINK_TEXT,"新闻")
driver.find_element(By.PARTIAL_LINK_TEXT,"新")
driver.find_element(By.XPATH,"//*[@class='bg s_btn']")
driver.find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")

 


二、元素操作

  1、点击操作

  element.click()

  2、输入操作

  element.send_keys("value")

  3、清除操作

  element.clear()
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()

 


三、浏览器操作

  1、窗口处理方法

    1. 最大化浏览器窗口

    driver.maximize_window()

    2. 设置浏览器窗口大小

    dirver.set_window_size(width, height)

    3. 设置浏览器窗口位置

    driver.set_window_position(x, y)

  2、浏览器页面操作方法

    1. 模拟浏览器后退按钮

    driver.back()

    2. 模拟浏览器前进按钮

    driver.forward()

    3. 模拟浏览器F5刷新

    driver.refresh()

    4. 模拟点击浏览器关闭按钮

    driver.close()

    5. 关闭所有程序启动的窗口(关闭浏览器驱动对象)

    driver.quit()

  3、两个属性

    1. 获取浏览器当前窗口的标题

    driver.title

    2. 获取浏览器当前窗口的URL地址

    driver.current_url

 


四、获取元素信息

  1、size

  获取元素的大小,返回的是一个字典,里面包含元素高度和宽度的值

  2、get_attribute("attribute")

  获取元素对应属性名称的属性值, attribute表示的是属性名

  3、text

  获取元素的文本内容

  4、is_displayed()

  判断元素是否可见 返回值是True或者False

  5、is_enabled()

  判断元素是否可用, 返回值是True或者False

  6、is_selected()

  判断复选框或者单选框元素是否选中, 返回值是True或者False

# 导入selenium
from selenium import webdriver

# 实例化浏览器驱动对象
driver = webdriver.Chrome()
# 打开百度网站
driver.get("http://www.baidu.com")

# 获得输入框的尺寸
size = driver.find_element_by_id('kw').size
print(size)

# 返回百度页面底部备案信息
text = driver.find_element_by_id("cp").text
print(text)

# 返回元素的属性值,可以是 id、name、type 或其他任意属性
attribute = driver.find_element_by_id("kw").get_attribute('type')
print(attribute)

# 返回元素的结果是否可见,返回结果为 True 或 False
result = driver.find_element_by_id("kw").is_displayed()
print(result)

# 退出浏览器驱动(释放系统资源)
driver.quit()

 


五、鼠标和键盘操作

  1、鼠标操作

1、创建鼠标对象

action = ActionChains(driver)

2、调用鼠标事件方法

1. 双击

action.double_click(element)   # element表示是元素对象

2. 右击

action.context_click(element)   # element表示的是元素对象

3. 悬停

action.move_to_element(element)   # element表示的是元素对象

4. 拖动

action.drag_and_drop(source,target)

   # source表示的是源元素,被拖动的元素

  # target表示是目标源,也就是要拖动到哪个元素上

5. 单元素拖动

action.drag_and_drop_by_offset(element, x, y)

  # x, y 表示的元素拖动时横向和纵向移动的距离,单位为像素

  # element表示的是元素对象,移动的像素最终要比在web页面中看到的移动像素值要大,最好大于5个像素或者10像素。

3、执行鼠标方法

action.perform()

  2、键盘操作

  1、在使用键盘按键方法前需要先导入 Keys 类。

from selenium.webdriver.common.keys import Keys

  2、调用方法

  element.send_keys(Keys.快捷键的键值)

    单键值: 直接传入对应的键值

    组合键: 键值之间由逗号分隔

  3、常用的快捷键

1. send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

2. send_keys(Keys.SPACE) 空格键(Space)

3. send_keys(Keys.TAB) 制表键(Tab)

4. send_keys(Keys.ESCAPE) 回退键(Esc)

5. send_keys(Keys.ENTER) 回车键(Enter)

6. send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)

7. send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)

8. send_keys(Keys.CONTROL, 'v') 粘贴

 


六、元素等待

  1、显式等待

  针对要定位的指定元素,如果能找到就返回该元素,如果不能定位到,则会每隔指定时间再去查找定位,如果超过最长的等待时间,还不能定位到,则抛出TimeOutException。

  格式:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

    driver:浏览器驱动。

    timeout:最长超时时间,默认以秒为单位。

    poll_frequency:检测的间隔(步长)时间,默认为 0.5s。

    ignored_exceptions:超时后的异常信息,默认情况下抛出 NoSuchElementException异常。

  一般与 until()或 until_not()方法配合使用。

  1. until(method, message=″)

  调用该方法提供的驱动程序作为一个参数,直到返回值为 True。

  2.until_not(method, message=″)

  调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

  2、隐式等待

  针对定位的元素,如果能定位到就返回或者继续后面的操作,如果不能定位到,会每隔0.5秒再去查找定位,如果到超时的时间还没有找到该 ,则会报NoSuchElementException的错误。

  格式:driver.implicitly_wait(timeout)

    timeout表示的最长的等待时间

  隐式等待只需要定义一次,针对所有的元素定位方法都有效。

  3、强制等待

  强制等待就是让代码休眠,不做任何的操作。

  time.sleep(time)    # time暂停的时间,单位也为秒

 


七、下拉选择框、弹出框、滚动条操作

  1、下拉选择框操作

  1、导入Select类

  from selenium.webdriver.support.select import Select

  2、实例化select对象

  select=Select(element)   # element元素对象表示的是select元素

  3、通过select的相关方法选择option选项

  select.select_by_index(index)

    参数index表示的option索引

  select.select_by_value(value)

    参数value表示的是option元属中value的属性值

  select.select_by_visible_text(visible_text )

    参数visible_text表示的是option的文本内容

  2、弹出框操作

  1、 获取弹出框对象

  driver.switch_to.alert()

  2、针对弹出框进行处理

  alert.text   # 获取弹出框提示信息

  alert.accept()   # 确定弹出框

  alert.dismiss()   # 取消弹出框

  alert\confirm\prompt 这三种弹出框的处理方式都是一样的

  3、滚动条操作

  1、定义js

  js = "window.scrollTo(0, 2000)"

  如果想要移动到最下方,y值给最大值就可以了

  2、执行js

  driver.execute_script(js)

 


八、frame切换

  1、切换到指定frame中

  driver.switch_to.frame(frame_element)   # frame_element表示的是iframe元素对象

  2、回到默认的首页

  driver.switch_to.default_content()

  3、总结点

1. 要进入的frame有几个层级,就需要切换几次

2. 切换到同一层级的frame中里,需要回到默认首页

3. 不管当前在frame哪个层级,要回到首页只需要调用一次恢复到默认首页的方法

 


九、多窗口切换

  窗口句柄:由操作系统生成且是每一个窗口的唯一识别码,相当于身份证号码。

  1、获取当前窗口句柄

  driver.current_window_handle

  2、获取所有窗口句柄

  driver.window_handles   # 返回的是一个列表

  3、切换窗口句柄

  driver.switch_to.window(window_handle)

  4、窗口切换与frame切换的区别:

  窗口切换是指针对浏览器窗口,frame切换针对的是同一个窗口中的html代码。

 


十、窗口截图

  1、目的

  当程序运行出错时,通过截图文件能够更直观的知道具体是哪个操作步骤出错

  2、实现方法  

  driver.get_screenshot_as_file(filename)  

  3、注意点  

  filename文件名的后缀必须是以png结尾

 


十一、验证码

1、定义

  是指随机生成的一串信息(图片、文字、数字、算术、短信验证码)

  2、作用

  防止恶意请求,保障软件系统的安全性

  3、验证码处理方式

  1、设置万能验证码

  由开发去实施, 一般只会用在测试环境

  2、去掉验证码

  由开发去实施,也只是用在测试不境中

  3、验证码识别技术

  由于技术成本高,而且识别率很难达到100%,不建议使用

  4、cookie技术

  通过记录cookie信息跳过登录操作

  4、cookie工作原理

  1、cookie是由服务端生成的

  2、cookie是保存在浏览器里面的

  5、cookie处理方法

  1、获取指定的cookie信息

  driver.get_cookie(name)   # 返回的值是字典

  2、获取所有cookie信息

  driver.get_cookies()   # 返回值是列表

  3、添加cookie信息

  driver.add_cookie(dict_cookie)

    dict_cookie是一个字典,且在这个字典当中必须包含 name以及value的键值对

  4、删除名为 OpenString 的 Cookie

  delete_cookie(name,optionsString)

  5、删除所有 Cookie

  delete_all_cookies()

  6、cookie实际工作应用

1、手工登陆之后获取到cookie信息

2、再通过自动化代码添加cookie到浏览器

3、在自动化代码执行过程当中,不能退出登陆

 


十二、文件的上传

 

  1、需要安装autoit-v3的工具,通过此工具可以查看到window窗口的信息及控件信息

  2、需要安装基于python的pyautoit

    在线安装: pip install pyautoit

    离线安装方式:解压离线安装包之后,进入到解压目录,执行:python setup.py install

  3、调用autoit来控制windows窗口

1. 获取windows弹出窗口

autoit.win_wait_active("打开", 3)

2. 在windows弹出窗口中的文件名输入框中输入文件地址及文件名称

autoit.control_send("打开", "Edit1", r"C:\Users\LiaoFei\Pictures\Saved Pictures\333.jpg")

3. 在windows弹出窗口中点击 打开按钮进行文件上传

autoit.control_click("打开", "Button1")

 


十三、定位一组元素

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()

示例:

from time import sleep
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")

driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(2)

# 定位一组元素
texts = driver.find_elements_by_xpath("//div[@tpl='se_com_default']/h3/a")

# 计算匹配结果个数
print(len(texts))

# 循环遍历出每一条搜索结果的标题
for t in texts:
    print(t.text)

# 退出浏览器驱动(释放系统资源)
driver.quit()

 

标签:WebDriver,name,定位,元素,driver,element,API,自动化,find
来源: https://www.cnblogs.com/mtoy/p/16437569.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有