Python自动化Python

[SP_03] Selenium WebDriver定位元素的9

2018-07-06  本文已影响0人  Fighting_001

目录结构

一、元素定位:id与name属性的定位
二、元素定位:tag_name标签定位
三、元素定位:class_name
四、元素定位:link_text定位
五、XPath定位
六、CSS定位
七、下拉菜单元素定位
八、frame嵌套页面元素定位
九、By方式定位

一、元素定位:id与name属性的定位

元素定位:是自动测试的核心。想要操作一个元素,首先需要识别这个元素。

WebDriver提供了一系列的元素定位方法,常用的有:

id与name定位-案例:
打开百度首页,在搜索框中自动输入关键词“Selenium自学”,然后点击搜索按钮,查看搜索页面的结果。

属性id,属性值="kw"; 属性name,属性值="wd"

Baidu输入框

属性id,属性值="su"

搜索按钮
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()

driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("Selenium自学")
driver.find_element_by_name("wd").send_keys("软件测试进阶")
sleep(2)
driver.find_element_by_id("su").click()

执行过程:



二、元素定位:tag_name标签定位

from selenium import webdriver
from time import  sleep

driver = webdriver.Chrome()

driver.get("http://xxx")

# 方式1:定位指定页面上input标签的元素(自上而下找到第1个input)
driver.find_element_by_tag_name("input").send_keys("Selenium")

# # 方式2:定位所有input标签中指定的某一个input(此处[0]代表第1个input标签)
# 以下需要用elements,因为是对页面上的所有input标签形成集合
# driver.find_elements_by_tag_name("input")[0].send_keys("Selenium")

sleep(2)
driver.quit()

执行过程:

其中的一个input标签元素

采用方式1和方式2都可以达到以上效果,方式2可以修改列表的下标[n]为其他值,从而定位到页面上的其他input标签元素。相比之下,属性定位比标签定位更为精准。

三、元素定位:class_name

根据标签中class属性进行定位


input标签中的class属性
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()

driver.get("http://www.baidu.com")
driver.find_element_by_class_name("s_ipt").send_keys("Selenium自学加油")
sleep(2)
driver.find_element_by_id("su").click()

driver.quit()

四、元素定位:link_text定位

根据带有超链接的文字进行定位

from selenium import webdriver
from time import  sleep

driver = webdriver.Chrome()

driver.get("http://www.baidu.com")
# 文字完全匹配定位
driver.find_element_by_link_text("学术").click()
sleep(2)
# 文字部分匹配定位
driver.find_element_by_partial_link_text("论文").click()
sleep(6)

driver.quit()

实现效果:
1)打开Chrome浏览器,输入Baidu的url访问,在Baidu首页定位到“学术"并点击之,打开学术的页面,停顿2s;
2)跳转打开的学术页面中,定位到“论文查重”并点击之,打开关于论文查重的页面,停顿6s;
3)关闭退出Chrome浏览器

带有超链接的文字:学术 包含“论文”的超链接文字:论文查重

五、XPath定位

XPath:即XML路径语言,是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。

使用场景:XPath用在对于被定位元素没有id、class、name等属性时的一种定位方式,在实际项目中不是所有元素都会有这些属性。

1.XPath绝对路径、相对路径定位

案例:实现从百度首页点击输入框中相机图标,打开的上传图片弹框中,在图片链接输入框输入设定的url字符串,然后点击弹框的关闭按钮“×”进行关闭弹框。

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")
# 根据XPath绝对路径定位到Baidu输入框中的相机按钮,并点击之
driver.find_element_by_xpath("//*[@id='form']/span[1]/span").click()
sleep(3)
# 根据XPath相对路径定位到上传图片的链接输入框,并输入设定的url字符串
driver.find_element_by_xpath("//*[@id='soutu-url-kw']").send_keys("www.baidu.com")
sleep(3)
# 根据XPath绝对路径定位到上传图片弹框的关闭按钮,并点击之
driver.find_element_by_xpath("//*[@id='form']/div/a").click()

driver.quit()

xpath路径 //*[@id='form']/span[1]/span 的含义:
//:代表当前打开的页面
*:通配符,代表不指定具体的标签名称;当存在多个标签名时,为了精准快速定位,建议还是写明具体的定位标签,比如input、span
@id='form':代表属性id的值为form的元素
//../../../:代表XPath的路径结构

2.XPath层级、逻辑组合定位

1)路径层级与属性结合定位
2)属性的逻辑组合定位

from selenium import webdriver
from time import  sleep

driver = webdriver.Chrome()

# 打开Baidu首页
driver.get("https://www.baidu.com")
# 通过链接文本“学术”定位,并点击打开百度学术页面
driver.find_element_by_link_text("学术").click()
sleep(3)

# 1)路径层级与属性结合定位
# 通过xpath绝对路径定位到学术搜索输入框中的高级搜索按钮并点击
driver.find_element_by_xpath("//*[@id='fm']/div[1]/span/i").click()
# 在展开的高级搜索弹框中,定位到第一个搜索条件输入框,并输入设置的关键词
driver.find_element_by_xpath("//*[@id='sc_adv_frm']/div[1]/span[2]/input").send_keys("自动化测试")
sleep(4)

# 2)属性的逻辑组合定位
# 定位学术高级搜索的“搜索”按钮并点击之
driver.find_element_by_xpath("//input[@type='submit' and @value='搜索']").click()
sleep(3)

driver.quit()
代码执行流程

六、CSS定位

Selenium极力推荐使用CSS定位,而非XPath来定位元素,原因是CSS定位比XPath效率高速度快,语法也更加简洁。

CSS常用定位方法:

  1. find_element_by_css_selector()
  2. #id (id选择器,根据id属性来定位元素,#作为id的标志)
  3. .class (class选择器,根据class属性值来定位元素,.作为class [css类] 的标志)
  4. [attribute='value'] (根据属性来定位元素)
  5. element > element (根据元素层级来定位: 父元素>子元素)
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")

# 根据元素层级来定位
driver.find_element_by_css_selector("#form > span.bg.s_ipt_wr.quickdelete-wrap > span").click()
driver.find_element_by_css_selector("#form > div > a").click()
sleep(2)

# 根据id来定位
driver.find_element_by_css_selector('#kw').send_keys("Python")

# 根据class定位
driver.find_element_by_css_selector('.s_ipt').send_keys("自动化测试")

# 根据属性来定位
driver.get("https://www.baidu.com")
driver.find_element_by_css_selector("[autocomplete='off']").send_keys("Selenium")
driver.find_element_by_id('su').click()
sleep(3)

driver.quit()
Baidu搜索框定位元素

七、下拉菜单元素定位

案例:在Baidu高级搜索页面,输入关键词“自动化测试”,筛选网页时间位“最近一周”,网页显示格式为.pdf,点击“百度一下”进行高级搜索查看结果。

1.根据css、xpath等定位下拉列表元素

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()

driver.get("https://www.baidu.com/gaoji/advanced.html")
sleep(2)

# 根据css、xpath等定位下拉列表元素
driver.find_element_by_id("keyword").send_keys("自动化测试")
driver.find_element_by_css_selector("[value='7']").click()
driver.find_element_by_xpath("/html/body/form/table[2]/tbody/tr[4]/td[3]/select/option[2]").click()
driver.find_element_by_xpath("//input[@value='百度一下']").click()
sleep(2)

driver.quit()

执行过程:

搜索结果

2.根据Select类进行定位

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import Select

driver = webdriver.Chrome()

driver.get("https://www.baidu.com/gaoji/advanced.html")

# 利用Select类进行定位
# 首先定位到时间筛选的整个下拉列表Select类
select = Select(driver.find_element_by_css_selector("[name='lm']"))

# 根据下标定位Select类下的第3个元素,即“最近一周”
select.select_by_index(2)
sleep(3)

# 根据文本内容定位Select类下对应的元素,即“最近一月”
select.select_by_visible_text("最近一月")
sleep(3)

# 根据value值定位Selec类下的元素,即“最近一年”
select.select_by_value("360")
sleep(3)

driver.quit()


八、frame嵌套页面元素定位

案例:在Frame.html文件中定位sogou搜索页面,然后进行搜索操作

from selenium import  webdriver
from time import sleep

driver = webdriver.Chrome()

# 设置网页文件路径,r代表路径转义
file_path = r'X:\...\xxx\Frame.html'
# 路径转义的另一种写法
#filel_path = 'X:\\...\\xxx\\Frame.html'

# 获取网页文件中的src属性的url地址,并在打开的浏览器中访问
driver.get(file_path)

# 切换到frame页面之内,此时引用的是Frame.html文件中id属性值"search"
driver.switch_to.frame("search")

# 定位到搜索框,并输入关键词
driver.find_element_by_css_selector("#query").send_keys("Python")
# 定位到搜索按钮,并点击之
driver.find_element_by_css_selector("#stb").click()
sleep(5)

driver.quit()

Frame.html文件的代码如下:

<html>
    <head>
        <title>Frame_test</title>
    </head>
    
    <body>
        <div>
            <iframe id="search" src="https://www.sogou.com" width="800" height="500">
        </div>
    </body>
</html>

执行过程:



九、By方式定位

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.implicitly_wait(5)

driver.find_element(By.ID,"kw").clear()
driver.find_element(By.NAME,"wd").send_keys("Selenium")
driver.find_element(By.CLASS_NAME,"s_ipt").send_keys("自动化")
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("测试用例")
sleep(3)

driver.find_element(By.ID,"su").click()
sleep(3)

driver.quit()

执行结果:

上一篇下一篇

猜你喜欢

热点阅读