WebDriver API之元素定位
来源:互联网 发布:单片机电流采样电路 编辑:程序博客网 时间:2024/05/22 01:26
CSS定位
CSS 可以比较灵活选择控件的任意属性,一般情况下定位速度要比 XPath 快。
css选择器常见语法
<span class="bg s_ipt_wr"><input id="kw" class="s_ipt" autocomplete="off"maxlength="100" value="" name="wd"></span><span class="bg s_btn_wr"><input id="su" class="bg s_btn" type="submit"value="百度一下"></span>
通过 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 属性来定位元素。
通过标签名定位:
find_element_by_css_selector(“input”)
在 CSS 语言中用标签名定位元素不需要任何符号标识,直接使用标签名即可,但我们前面已经了解到
标签名重复的概率非常大,所以通过这种方式很难唯一的标识一个元素。
通过父子关系定位:
find_element_by_css_selector(“span>input”)
上面的写法表示有父亲元素,它的标签名叫 span,查找它的所有标签名叫 input 的子元素。
通过属性定位:
find_element_by_css_selector("input[autocomplete='off']")find_element_by_css_selector("input[maxlength='100']")find_element_by_css_selector("input[type='submit']")
在 CSS 当中也可以使用元素的任意属性,只要这些属性可以唯一的标识这个元素。
组合定位:
我们当然可以把上面的定位策略组合起来使用,这样就大大加强了元素的唯一性。
find_element_by_css_selector("span.bg s_ipt_wr>input.s_ipt")find_element_by_css_selector("span.bg s_btn_wr>input#su")
有一个父元素,它的标签名叫 span,它有一个 class 属性值叫 bg s_ipt_wr,它有一个子元素,标签名
叫 input,并且这个子元素的 class 属性值叫 s_ipt。好吧!我们要找的就是具有这么多特征的一个子元素。
XPath定位
利用元素属性定位:
find_element_by_xpath("//input[@id='kw']")find_element_by_xpath("//input[@id='su']")//表示当前页面某个目录下,input 表示定位元素的标签名,[@id='kw'] 表示这个元素的 id 属性值等于kw。下面通过 name 和 class 属性值来定位。find_element_by_xpath("//input[@id='wd']")find_element_by_xpath("//input[@class='s_ipt']")find_element_by_xpath("//*[@class='bg s_btn']")如果不想指定标签名也可以用星号(*)代替。当然,使用 XPath 不仅仅只局限在 id、name 和 class 这三个属性值,元素的任意属性值都可以使用,只要它能唯一的标识一个元素。find_element_by_xpath("//input[@maxlength='100']")find_element_by_xpath("//input[@autocomplete='off']")find_element_by_xpath("//input[@type='submit']")
层级与属性结合:
如果一个元素本身并没有可以唯一标识这个元素的属性值,我们可以找其上一级元素,如果它的上级
有可以唯一标识属性的值,也可以拿来使用。参考 baidu.html 文本。
……<form id="form" class="fm" action="/s" name="f"> <input type="hidden" value="utf-8" name="ie"> <input type="hidden" value="8" name="f"> <input type="hidden" value="1" name="rsv_bp"> <input type="hidden" value="1" name="rsv_idx"> <input type="hidden" value="" name="ch"> <input type="hidden" value="02.." name="tn"> <input type="hidden" value="" name="bar"> <span class="bg s_ipt_wr"> <input id="kw" class="s_ipt" autocomplete="off" maxlength="100" value="" name="wd"> </span> <span class="bg s_btn_wr"> <input id="su" class="bg s_btn" type="submit" value="百度一下"> </span>……
假如百度输入框本身没有可利用的属性值,我们可以查找它的上一级属性。
ind_element_by_xpath("//span[@class='bg s_ipt_wr']/input")find_element_by_xpath("//span[@class='bg s_btn_wr']/input")
span[@class=’bg s_ipt_wr’]
通过 class 属性定位到是父元素,后面/input 也就表示父元素下面标签名为
input 的子元素。如果父元素没有可利用的属性值,那么可以继续向上查找“爷爷”元素。
find_element_by_xpath("//form[@id='form']/span/input")find_element_by_xpath("//form[@id='form']/span[2]/input")
我们可以通过这种方法一级一级的向上打找,直到找到最外层的html标签,那么就是一个绝对路径
的写法了。
使用逻辑运算符
如果一个属性不能唯一的区分一个元素,我们还可以使用逻辑运算符连接多个属性来区别于其它属
性。
……<input id="kw" class="su" name="ie"><input id="kw" class="aa" name="ie"><input id="bb" class="su" name="ie">……
如上面的三行元素,假如我们现在要定位第一行元素,如果使用 id 将会与第二行元素重名,如果使用
class 将会与第三行元素的重名。那么如果同时使用 id 和 class 就会唯一的标识这个元素。那么这个时候就
可以通过逻辑运算符号连接。
find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")
当然,我们也可以用 and 连接更多的属性来唯一的标识一个元素。
id和name定位
find_element_by_id("kw")find_element_by_name("wd")
class定位
find_element_by_class_name()方法用于元素中 class 属性的定位。
find_element_by_class_name("s_ipt")
tag定位
tag 定位取的是一个元素的标签名,通过标签名去定位单个元素的唯一性最底,因为在一个页面中有太多的元素标签为< div>和了,所以很难通过标签名去区分不同的元素。
通过标签名定位百度首页上的输入框与百度搜索按钮:
find_element_by_tag_name("input")
find_element_by_tag_name()方法通过元素的 tag name 来定位元素。通过上面的例子,我们并不能区别
不同的元素,因为在一个页面上标签名相同很难以避免。
link定位
ink 定位与前面介绍的几种定位方法有所不同,它专门用来定位本链接。百度输入框上面的几个文本
链接的代码如下:
<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>
通过查看上面的代码,我们发现通过 name 属性定位是个不错的选择。不过我们这里为了要学习 link
定位,通过 link 定位实现如下:
find_element_by_link_text("新闻")find_element_by_link_text("hao123")
find_element_by_link_text()方法通过元素标签对之间的文本信息来定位元素。不过,需要强调的是
Python2 对于中文的支持并不好,如查 Python 在执行中文的地方出现在乱码,可以在中文件字符串的前面
加个小“u”可以有效的避免乱码的问题,加 u 的作用是把中文字符串转换中 unicode 编码,如:
find_element_by_link_text(u"新闻")
partial link 定位
parial link 定位是对 link 定们的一个种补充,有些文本连接会比较长,这个时候我们可以取文本链接的有一部分定位,只要这一部分信息可以唯一的标识这个链接。
<a class="mnav" name="tj_lang" href="#">一个很长很长的文本链接</a>
通过 partial link 定位如下:
find_element_by_partial_link_text("一个很长的")find_element_by_partial_link_text("文本连接")
find_element_by_link_text()方法通过元素标签对之间的==部分文本信息==来定位元素。
用 By 定位元素
from selenium.webdriver.common.by import Byfind_element(By.ID,"kw")find_element(By.NAME,"wd")find_element(By.CLASS_NAME,"s_ipt")find_element(By.TAG_NAME,"input")find_element(By.LINK_TEXT,u"新闻")find_element(By.PARTIAL_LINK_TEXT,u"新")find_element(By.XPATH,"//*[@class='bg s_btn']")find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")
- WebDriver API之元素定位
- Webdriver定位之iframe中的元素定位
- WebDriver--定位UI元素
- selenium webdriver定位元素
- webdriver元素定位方法
- webdriver定位不到元素
- webdriver定位元素技巧
- webdriver-定位一组元素
- webdriver 定位元素
- selenium webdriver元素定位
- WebDriver拾级而上·之三 定位页面元素
- WebDriver拾级而上·之三 定位页面元素
- selenium webdriver 元素定位常见问题
- selenium webdriver 元素定位方法
- Selenium Webdriver元素定位(转)
- selenium webdriver 元素定位扩展
- Selenium Webdriver元素定位方法
- Selenium-WebDriver API命令与操作——八种元素定位
- MySql杂项
- c++降序排序
- oracle 向上递归 向下递归查询
- python opencv 创建窗口,加载图片,显示图片,灰度转换,保存图片
- 对spring-boot+shiro的学习(借助别人家的框架来理解)
- WebDriver API之元素定位
- 面向对象知识点小记(3)
- Python之list,string,tuple,dict练习题
- diamond 详解
- <转载> 关于js常用方法的封装
- Could not find the main class: org.eclipse.ant.internal.launching.remote.InternalAntRunner
- 二叉树采用二叉链表存储,复制二叉树的算法(树的应用)
- Bootstrap学习笔记 03
- 【codevs 1316】文化之旅