UI自动化- senlenium中的元素定位(二)

目标
1、掌握xpath和CSS元素定位方
2、掌握元素及浏览器操作

1 xpath元素定位

1.1 什么是xpath

总结:xpath是用来在xml文件中进行元素定位的标记语言,html是一种特殊的xml,所以xpath也可以用在html中

1.2 Xpath定位策略

  • 路径定位
  • 属性定位
  • 属性与逻辑结合
  • 属性与层级结合
1.2.1 路径定位
  • 绝对路径 表达式是以 /html开头,元素的层级之间是以 / 分隔

    相同层级的元素可以使用下标,下标是从1开始.

    需要列出元素所经过的所有层级元素 , 工作当中, 一般不使用绝对路径

    例:/html/body/div/fieldset/form/p[1]/input

  • 相对路径 匹配任意层级的元素, 是以 //tag_name或者//* 开头

    也可以使用下标,下标是从1开始。

    例子://p[5]/button

# 通过xpath的绝对路径定位用户名输入框并输入admin
driver.find_element_by_xpath("/html/body/div/fieldset/form/p/input").send_keys("admin")
# 等待3S
time.sleep(3)
# 通过xapth的相对路径定位密码输入框并输入123
driver.find_element_by_xpath("//form/p[2]/input").send_keys("123")
1.2.2 元素属性定位
  • //*或者//tag_name //*[@attribute='value'] # attribute表示的是元素的属性名,value表示的是元素对应属性值
driver.find_elemet_by_xpath("//*[@placehoulder ='请输入用户名']").send_keys('admin')
1.2.3 属性与逻辑结合定位
  • //* 或者//tag_name 开头 //*[@attribute1='value1' and @attribute2='value2']
driver.find_element_by_xpath("//input[@name ='user' and @class= 'login']").sendkeys('admin')
1.2.4 属性与层级结合定位
  • 是以//*或者//tag_name开头 //p[@id='pa']/input

    在任意层级当中,都可以结合属性来使用

driver.find_element_by_xpath("//p[@id='p1']/input").send_keys("admin")
1.2.5 XPATH扩展
  • //*[text() = 'value'] value表示的是要定位的元素的全部文本内容.

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

    要定位的元素中,attribute属性的属性值包含了value的内容。

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

    要定位的元素,attribute属性的属性值是以value开头

2、CSS定位

2.1 什么是CSS

总结:css是可以用来在selenium中定位元素的

CSS定位元素的方法: find_element_by_css_selector(css_selector) # css_selector表示的是CSS选择器表达式

2.2 CSS定位策略

  • id选择器
  • class选择器
  • 元素选择器
  • 属性选择器
  • 层级选择器
2.2.1 id选择器
  • 表达式: #id # 表示通过元素的ID属性进行元素选择 id 表示的的id属性的属性值
driver.find_element_by_css_selector('#user').send_keys('admin')
2.2.2 class选择器
  • 表达式: .class # .表示通过元素的class属性进行元素选择, class表示的class属性的其中一个属性值
driver.find_element_by_css_selector('.email').send_keys('123@qq.com')
2.2.3 元素选择器
  • 就是通过元素标签名称来选择元素 。表达式: tag_name 不推荐使用
2.2.4 属性选择器
  • 就是通过元素的属性来选择元素。 表达式:[attribute='value'] #attribute 表示的是属性名称,value表示的是属性值
    如果使用的是class属性,需要带上class的全部属性值
driver.find_element_by_css_selector("input").send_keys("admin")
# 通过css的属性选择器定位电子邮箱输入框,输入123@qq.com
driver.find_element_by_css_selector("[class='emailA dzyxA']").send_keys("123@qq.com")
  • 父子层级关系选择 器

    • 表达式: element1>element2 通过element1来找element2并且element2是element1的直接子元素
  • 隔代层级关系选择器

    • 表达式: element1 element2 通过element1来找element2并且element2是element1的后代元素
driver.find_element_by_css_selector('.zc #userA').send_keys('admin')
2.2.6CSS扩展
  • input[type^='value'] input表示标签名称,type表示属性名称, value表示的文本内容

    查找元素type属性值是以value开头的元素

  • input[type$='value'] input表示标签名称,type表示属性名称, value表示的文本内容

    查找元素type属性值以value结尾的元素

  • input[type*='value'] input表示标签名称,type表示属性名称, value表示的文本内容

    查找元素type属性值包含value的元素

image-20200622150415134.png

4、定位元素的另外一种写法

  • find_element(By.ID, id) 需要导入By类。

二、元素操作及浏览器操作方法

1、元素操作

  • 点击操作 element.click() element表示的是元素对象
  • 输入操作 element.send_keys("value") element表示的是元素对象, value表示的是要输入的内容
  • 清除操作 element.clear() element表示的是元素对象. 将输入框里面的内容全部清除
import time
from selenium import webdriver
frome senlenium,webdriver.common.by import By

driver = webdriver.Chrome()
# 打开测试网站
driver.get('' ")
driver.find_element(By.ID,'userA').send_keys('admin')
driver.find_element(By.ID, 'passwordA').send_kes('123456')
driver.find_element(By.XPATH, "//*[@class='emailA dzyxA']").send_keys("123@qq.com")
# 2).间隔3秒,修改电话号码为:18600000000
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, ".telA").clear()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, ".telA").send_keys("18600000000")

# 等待3S
time.sleep(3)
# 退出
driver.quit()

2、浏览器操作

  • 浏览器常用操作方法
  1. maximize_window() 最大化浏览器窗口 --> 模拟浏览器最大化按钮 实例化浏览器驱动之后,就可以调用窗口最大化的方法

  2. set_window_size(width, height) 设置浏览器窗口大小 --> 设置浏览器宽、高(像素点)

  3. set_window_position(x, y) 设置浏览器窗口位置 --> 设置浏览器位置

    x,y是一个坐标点,通过此坐标点确定浏览器最左上角的位置,以此确定浏览器在屏幕上的位置。

    x, y不能超过屏幕的分辨率大小

# 导包
import timefrom selenium import webdriver
# 创建浏览器驱动对象
from selenium.webdriver.common.by
 import By
driver = webdriver.Chrome()
# 窗口最大化
driver.maximize_window()
# 打开测试网站
driver.get("file:///D:/software/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/web%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/pagetest/%E6%B3%A8%E5%86%8CA.html")time.sleep(3)
# 设置窗口大小
driver.set_window_size(500, 500)
time.sleep(3)
# 设置窗口位置
driver.set_window_position(300, 300
)# 等待
3Stime.sleep(3)
# 退出
driver.quit()
  1. back() 后退 --> 模拟浏览器后退按钮
  2. forward() 前进 --> 模拟浏览器前进按钮
  3. refresh() 刷新 --> 模拟浏览器F5刷新
  4. close() 关闭当前窗口 --> 模拟点击浏览器关闭按钮
  5. quit() 关闭浏览器驱动对象 --> 关闭所有程序启动的窗口
driver.back()
driver.forward()
driver.find_element(By.XPATH, "//*[text()='访问 新浪 网站']").click()
driver.close()
driver.quit()
  1. title 获取页面title
  2. current_url 获取当前页面URL

3、获取元素信息

  • 为什么要学习获取元素信息的方法

    主要为了获取相关的信息进行断言,判断自动化用例最终的执行结果。

  • 获取元素常用的方法:

    • size 获取元素的大小 返回的是一个字典,里面包含 元素高度和宽度的值
    • text 获取元素的文本内容
    • get_attribute("attribute") 获取元素对应属性名称的属性值 , attribute表示的是属性名
#1. 获取用户名输入框的大小
driver.find_element(By.ID,'userA').size

#2. 获取页面上第一个超链接文本的内容
driver.find_element(By.LINK_TEXT,'新浪').text
#3. 获取第一个超链接的地址
driiver.find_element(By.LINK_TEXT.'新浪').get_attribute('href')

  • is_displaye() 判断元素是否可见 返回值为true 或者false
  • is_enabled() 判断元素是否可用,返回值true或者false
  • is_selected() 判断复选框或者单选框是否被选中,返回值为true或者false
# 4. 判断span元素是否可见,
print(driver.find_element(By.Name, 'sp1').is_dispalyed())

# 判断取消按钮是否可用
print(driver.find_element(By.ID, 'cancelA').is_enabled())

# 判断页面中’旅游‘对应的复选框是否选中状态
print(driver.find_element(By.ID, 'lyA').is_selected())
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容