关于webdriver元素定位的问题
Posted Taxus杉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于webdriver元素定位的问题相关的知识,希望对你有一定的参考价值。
今天终于解决了遗留很久的一个元素定位问题,非常感谢博友的博文帮助。可以参考:https://www.cnblogs.com/qingchunjun/p/4208159.html
现在总结自己学习过程中了解到的元素定位方法,与大家分享,如有不全的地方请大家多多指教。
--id
--name
--class name
--link text
--partial link text
--tag name
--xpath
--css selector
例如我们打开百度首页,要获取百度搜索框的元素定位,源代码如下:
<input autocomplete="off" maxlength="255" value="" class="s_ipt" name="wd" id="kw">
1、by_id()
我们通过id 来获取定位,代码如下:
driver=webdriver.Firefox() driver.get(\'https://www.baidu.com/\') driver.find_element_by_id(\'kw\').send_keys(\'哈哈哈\')
2、by_name()
我们通过name来定位,代码如下:
driver=webdriver.Firefox() driver.get(\'https://www.baidu.com/\') driver.find_element_by_name(\'wd\').send_keys(\'哈哈哈\')
3、by_class_name()
我们通过class name来定位,代码如下:
driver.find_element_by_class_name(\'s_ipt\').send_keys(\'哈哈哈\')
4、by_link_text()
当我们要定位的元素是超文本文字时,例如:
<a href="login/NewLogin/Logout">退出登录</a>
我们可以这样定位:
driver.find_element_by_link_text(\'退出登录\').click()
5、by_partial_link_text()
这是相对于上一种定位方式的模糊定位,只要填入的内容是页面上唯一的,就可以定位到该元素,如:
driver.find_element_by_partial_link_text(\'退出\').click()
6、by_tag_name()
标签名定位,如在QQ登录页面定位登录框,源代码如下:
<input type="text" tabindex="1" value="" name="u" id="u" class="inputstyle">
定位代码如下:
#定位标签为input的元素 driver.find_element_by_tag_name(\'input\').send_keys(\'555555555@qq.com\') #获取页面所有标签为input的标签,定位到第一个元素 driver.find_elements_by_tag_name(\'input\')[0].send_keys(\'555555555@qq.com\')
当使用driver.find_elements_by_tag_name(\'input\')时,编译器自动将所有input标签看做是一个列表,读取某一个input时需要指定元素下标。
7、by_xpath()
使用xpath定位是一个非常强大的定位方式,几乎所有的元素都能使用这个方法定位到。如定位百度搜索框
driver.find_element_by_xpath(\'/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input\').send_keys(\'哈哈哈’)
这是正常的使用xpath最原始的方法。(也是最初学习时掌握的方法)
a. 用contains关键字,定位代码如下: 1 driver.findElement(By.xpath(“//a[contains(@href, ‘logout’)]”)); 这句话的意思是寻找页面中href属性值包含有logout这个单词的所有a元素,由于这个退出按钮的href属性里肯定会包含logout,所以这种方式是可行的,也会经常用到。其中@后面可以跟该元素任意的属性名。 b. 用start-with,定位代码如下: 1 driver.findElement(By.xpath(“//a[starts-with(@rel, ‘nofo’)])); 这句的意思是寻找rel属性以nofo开头的a元素。其中@后面的rel可以替换成元素的任意其他属性。 c. 用Text关键字,定位代码如下: 1 driver.findElement(By.xpath(“//*[text()=’退出’])); 这个方法可谓相当霸气啊。直接查找页面当中所有的退出二字,根本就不用知道它是个a元素了。这种方法也经常用于纯文字的查找。 另外,如果知道超链接元素的文本内容,也可以用 1 driver.findElement(By.xpath(“//a[contains(text(), ’退出’)])); 这种方式一般用于知道超链接上显示的部分或全部文本信息时,可以使用。
8、by_css_selector
使用css定位也是非常强大的,并且相对xpath来说,css定位执行速度更快,代码如下:
#使用id定位 driver.find_element_by_css_selector(\'#kw\').send_keys(\'python\') # #使用class定位 driver.find_element_by_css_selector(\'.s_ipt\').send_keys(\'python\') #使用属性定位 driver.find_element_by_css_selector(\'[autocomplete="off"]\').send_keys(\'python\')
以上是正常的使用css最原始的方法。(也是最初学习时掌握的方法)
这里提一下之前我遇到的元素定位的问题,就是在定位页面元素时,源代码如下:
<button type="submit" class="btn radius size-L btn-danger" style="width: 100%;background-color:#c62b26">登 录</button>
这个里面既没有id,也没有name,起初我尝试着用class_name来实行定位,但是返回定位不到元素,也尝试过用link_text,,试着用学到的css方法来定位,按照class_name的方式,但返回是失败的,因为这里的class赋值(class="btn radius size-L btn-danger),其中都多个字符串组合而成,即使用了空格分隔,因此不能简单的像之前那样使用class_name定位,代码如下:
driver.find_element_by_css_selector(\'button.btn.radius.size-L.btn-danger\').click()
代码解读:先进入button标签下,再找到btu->radius->size-L.btn-danger。
最后,能使用id /name尽量使用,不能再考虑使用css或xpath。
与君共勉!
以上是关于关于webdriver元素定位的问题的主要内容,如果未能解决你的问题,请参考以下文章
第三章:WebDriver定位—— 单个元素定位(id , name ,class , LinkText )
如何通过 Selenium WebDriver 和 Python 定位用户名和密码元素
Selenium webdriver定位iframe里面元素