您好,欢迎来到榕意旅游网。
搜索
您的当前位置:首页Selenium元素定位的30种方式(史上最全)

Selenium元素定位的30种方式(史上最全)

来源:榕意旅游网
Selenium元素定位的30种⽅式(史上最全)

Selenium对⽹页的控制是基于各种前端元素的,在使⽤过程中,对于元素的定位是基础,只有准去抓取到对应元素才能进⾏后续的⾃动化控制,我在这⾥将对各种元素定位⽅式进⾏总结归纳⼀下。

这⾥将统⼀使⽤百度⾸页(www.baidu.com)进⾏⽰例,f12可以查看具体前端代码。WebDriver8种基本元素定位⽅式find_element_by_id()

采⽤id属性进⾏定位。例如在百度页⾯中输⼊关键字 Selenium 进⾏搜索。百度部分关键源码如下:

可以看到输⼊框和百度⼀下的按钮都有id,那么定位代码如下:

#coding=utf-8

from selenium import webdriverimport time

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()driver.implicitly_wait(10)

driver.get(\"http://www.baidu.com\")

driver.find_element_by_id(\"kw\").send_keys(\"Selenium\")driver.find_element_by_id(\"su\").click()

time.sleep(2)driver.quit()

find_element_by_name() find_element_by_class_name()

根据name元素和class的名字进⾏定位,这两种定位⽅式和id定位相似,在前端代码中,id、name和class⼀般都⾄少会有其中的⼀种,⽐如百度的搜索框具有name属性,我们可以⽤name定位搜索款,class定位百度⼀下的按钮:

driver.find_element_by_name(\"wd\").send_keys(\"Python\")driver.find_element_by_class_name(\"s_btn\").click()

find_element_by_xpath()

xpath是XML路径语⾔,它可以⽤来确定xml⽂档中的元素位置,通过元素的路径来完成对元素的查找。HTML就是XML的⼀种实现⽅式,所以xpath是⼀种⾮常强⼤的定位⽅式。xpath也分⼏种不同类型的定位⽅法。

⼀种是绝对路径定位。这种定位⽅式是利⽤html标签名的层级关系来定位元素的绝对路径,⼀般从标签开始依次往下进⾏查找。如百度搜索框的绝对路径xpath定位可以是这样

的:find_element_by_xpath(\"/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input\")

还有⼀种是利⽤元素属性来进⾏xpath定位,搜索框还可以利⽤id和name属性去定位:

find_element_by_xpath(\"//input[@id='kw']\")find_element_by_xpath(\"//*[@name='wd']\")

其中的标签名input也可以⽤*来代替,⽽且只要是在该标签内,任意属性都可以,⽐如搜索框的maxlength属性:

find_element_by_xpath(\"//input[@maxlength='255']\")

有的时候我们会发现绝对路径定位路径太长,⽽且光凭路径完全不可以猜测到其指向的具体页⾯元素,如果只有单纯的元素属性不⼀定可以每次查找的元素都可以⼜唯⼀的属性去⽅便定位,这个时候我们可以将这两种定位⽅式结合起来使⽤。

⽐如查找搜索框的时候发现其上级元素form⼜唯⼀的id⽅便定位,就可以先查找到form元素然后依次往下写路径:

find_element_by_xpath(\"//form[@id='form']/span/input\")

这种定位⽅式的使⽤过程中,如果元素的单个属性⽆法确定其唯⼀性,可以⽤and连接多个属性去确定。find_element_by_css_selector()

CSS属性定位可以⽐较灵活地选择控件的任意属性,定位⽅式也会⽐xpath快。同样是那个百度搜索的例⼦,可以试⼀下:

driver.find_element_by_css_selector(\".s_ipt\").send_keys(\"selenium\")driver.find_element_by_css_selector(\"#su\").click()

如果有css基础的话就应该可以看懂,⼀般class是⽤.标记,id是⽤#标记,标签名直接写具体标签名就好了。css定位⾥⾯也可以通过属性或者组合⽅式定位:

driver.find_element_by_css_selector(\"input[autocomplete='off']\").send_keys(\"Python\")driver.find_element_by_css_selector(\"span.bg.s_btn_wr>input#su\").click()

具体说⼀下百度⼀下那个按钮的组合定位⽅式,这样写的定位顺序是这样的,先定位到⼀个class名为bg s_btn_wr的span标签,在这个标签下⾯有⼀个id为su的input标签,这样就定位到了。

值得注意的是,在css⾥⾯下级标签元素⽤>连接,如果class⾥⾯有空格,空格⽤.进⾏连接。find_element_by_tag_name ()

通过标签名去定位的⽅式⼀般是这样的:find_element_by_tag_name(\"input\")

可见仅仅通过标签名去定位时,⼀般⼀种标签在⼀个页⾯⾥⾯会出现不⽌⼀次甚⾄⼤量出现,这种定位⽅式的作⽤不是很⼤,所以⽤的也就⽐较少。find_element_by_link_text()find_element_by_partial_link_text()

这两种定位⽅式是专门⽤于定位超链接的,也就是对应html页⾯中的标签,括号⾥传的值就是a标签中的超链接⽂字,两者的区别在于⼀个是完整的超链接⽂字,⼀个是可以只写部分超链接⽂字。⽐如点击百度⾸页中右上⾓的新闻超链接,可以这样去定位:

driver.find_element_by_link_text(\"新闻\").click()

driver.find_element_by_partial_link_text(\"闻\").click()

By定位

通过对上⾯8种基本元素定位⽅式的学习,在使⽤过程种可以根据实际的情况去选择对应的的定位⽅式,我们可以⽤By来设置定位策略,具体语法如下:

find_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\")

上⾯这些使⽤的前提是需要导⼊By类:from selenium.webdriver.common.by import By 最简单粗暴却失传已久的8种定位

据说这种定位⽅式在江湖上都快要失传了,实在想不通为什么,明明写起来最简单粗暴啊~

driver.find_element(\"name\driver.find_element(\"id\

相信通过上⾯的两只栗⼦,⼤家⼀定会和我⼀样觉得这种⽅式的定位实在是太省事了~只要写find_element就好啦,下⾯我们来总结⼀下这8种写法与基本定位⽅法类⽐过来该怎么写:

by_id -> find_element(\"id\by_xpath -> find_element(\"xpath\by_link_text -> find_element(\"link text\

by_partial_text -> find_element(\"partial link text\by_name -> find_element(\"name\by_tag_name -> find_element(\"tag name\by_class_name -> find_element(\"class name\by_css_selector -> find_element(\"css selector\elements复数定位

在上⾯的例举的⼋中基本定位⽅式种,都有对应的复数形式,分别是下⾯这些:

id复数定位find_elements_by_id()

name复数定位find_elements_by_name()

class复数定位find_elements_by_class_name()tag复数定位find_elements_by_tag_name()link复数定位find_elements_by_link_text()

partial_link复数定位find_elements_by_partial_link_text()xpath复数定位find_elements_by_xpath()

css复数定位find_elements_by_css_selector()

这些复数定位⽅式每次取到的都是具有相同类型属性的⼀组元素,所以返回的是⼀个list队列,我们也可以利⽤这个去定位单个的元素。⽐如百度⾸页种,右上⾓有新闻、视频、地图、贴吧等⼀些链接,我们通过f12查看源码可以发现,这些链接都有共同的class, 。

举个例⼦,⽐如定位排在第六个的学术,可以这样定位:driver.find_elements_by_class_name(\"mnav\")[5].click()还可以通过css的复数定位写法:driver.find_elements(\"css selector\

当然,也可以借助pop()函数,⼀般pop()或pop(-1)表⽰获取元素种的最后⼀个,pop(2)表⽰第三个:

driver.find_elements(\"css selector\

JS的5种定位⽅式总结

其实看到这⾥,上⾯的定位⽅式应该就基本够⽤了,但是有的时候就是会出现⼀些诡异的定位失效或者定位到了点击失效的问题,这个时候如果⽤js进⾏直接执⾏该事件,往往就可以解决那些诡异的事情~

id定位:document.getElementById()

name定位:document.getElementsByName()tag定位:document.getElementsByTagName()class定位:document.getElementsByClassName()css定位:document.querySelectorAll()

其中只有id对象⽤的是Element返回是单个对象,其他都是Elements返回的是⼀个list这点千万要注意,具体⽤法和上⾯的webdriver基础定位⼀样。先写好对应的js语句,可以先赋值给⼀个变量,然后后调⽤execute_script进⾏执⾏⼀下js就好了,下⾯还是结合那个百度搜索的栗⼦,我写的脚本,可以对应学习实验⼀下:

search_js = \"document.getElementsByName('wd')[0].value='selenium';\"search_js2 = \"document.querySelectorAll('.s_ipt')[0].value='selenium';\"button_js = \"document.getElementById('su').click();\"

button_js2 = \"document.getElementsByClassName('s_btn')[0].click()\"driver.execute_script(search_js2)driver.execute_script(button_js2)

以上分别结合常⽤的四种js定位⽅式写了四条js语句,然后要执⾏的就execute_script⼀下就好啦~超神的jQuery定位

据说会jQuery定位的在定位的路上就是披襟斩棘,所向披靡~如此超神的定位,还是可以了解⼀下的~jQuery语法是为HTML元素的选取编制的,可以对元素执⾏⼀些具体的操作基础语法是$(selector).action()

$符号定义jQuery,selector选择器⽤来查询具体的HTML元素,通过action()来执⾏对元素的具体操作。其中我们经常⽤到的action()在jq中有这么⼏种:

$(selector).val('input_value') 其中input_value表⽰要输⼊的⽂本的值$(selector).val('') 如果为空,则执⾏后是清空的意思$(selector).click() ⾏为也是肯定有的

让我们结合百度的栗⼦看⼀下,⽤jQuery的写法和js有⼀点点的类似,但明显简洁多了:

search_jq = \"$('#kw').val('selenium')\"button_jq = \"$('.s_btn').click()\"driver.execute_script(search_jq)driver.execute_script(button_jq)

以上就是对webdriver的⼀些基本定位⽅式总结,我们再来回顾⼀下:分别是……

8种webdriver的基本地位⽅式,还有对应的8种复数定位,js有5中定位⽅式,还有超神的jQuery定位,当然,不要忘了快要失传的那8种定位,⼀共是30种,在实际应⽤中,总有⼀种适合你(●ˇ∀ˇ●)

到此这篇关于Selenium元素定位的30种⽅式(史上最全)的⽂章就介绍到这了,更多相关Selenium元素定位内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

Copyright © 2019- nryq.cn 版权所有 赣ICP备2024042798号-6

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务