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()
Copyright © 2019- nryq.cn 版权所有 赣ICP备2024042798号-6
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务