欢迎加入学习交流QQ群:657341423
selenium总共有八种定位方法
By.id() 通过id定位
By.name() 通过name 定位
By.xpath() 通过xpath定位
By.className() 通过className定位
By.cssSelector() 通过CSS 定位
By.linkText() 通过linkText
By.tagName() 通过tagName
By.partialLinkText() 通过匹到的部分linkText
其中用得最多的是xpath,cssSelector,而且用这两种定位,基本上可以解决大部分网页定位困难,至于id,name有时候不能适用于网页,这个具体情况还是看网页Html怎样设计的。
XPath-利用元素属性定位
find_element_by_xpath("//input[@id=‘kw’]")
find_element_by_xpath("//input[@name=‘wd’]")
find_element_by_xpath("//*[@id=‘kw’]")
//input表示查找页面上所有的input元素
*//表示查找页面上所有元素
//input[1]表示查找页面上第一个input元素
//form[1]/input 表示查找第一个form元素下一级的input元素
//form[1]//input 表示查找页面上第一个form元素下的所有input元素,不管嵌套了多少层
//input[@id=‘kw’ and @class=‘su’] 可以用 and 连接多个属性来唯一标识一个元素
查找页面根元素://
查找页面上所有的input元素://input
查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input
查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input
查找页面上第一个form元素://form[1]
查找页面上id为loginForm的form元素://form[@id=‘loginForm’]
查找页面上具有name属性为username的input元素://input[@name=‘username’]
查找页面上id为loginForm的form元素下的第一个input元素://form[@id=‘loginForm’]/input[1]
查找页面具有name属性为contiune并且type属性为button的input元素://input[@name=‘continue’][@type=‘button’]
查找页面上id为loginForm的form元素下第4个input元素://form[@id=‘loginForm’]/input[4]
常见的cssSelector的定位方式:
定位id为flrs的div元素,可以写成:#flrs 注:相当于xpath语法的//div[@id=’flrs’]
定位id为flrs下的a元素,可以写成 #flrs > a 注:相当于xpath语法的//div[@id=’flrs’]/a
定位id为flrs下的href属性值为/forexample/about.html的元素,可以写成: #flrs > a[href=”/forexample/about.html”]
如果需要指定多个属性值时,可以逐一加在后面,如#flrs > input[name=”username”][type=”text”]。
*此外,cssSelector还有一些高级用法,如果熟练后可以更加方便地帮助我们定位元素,如我们可以利用^用于匹配一个前缀,$用于匹配一个后缀,用于匹配任意字符。例如:
匹配一个有id属性,并且id属性是以”id_prefix_”开头的超链接元素:a[id^=‘id_prefix_’]
匹配一个有id属性,并且id属性是以”_id_sufix”结尾的超链接元素:a[id$=’_id_sufix’]
匹配一个有id属性,并且id属性中包含”id_pattern”字符的超链接元素:a[id*=‘id_pattern’]
通过class属性定位
find_element_by_css_selector(".类属性值") class选择器选择class="a"的所有元素,点号(.)表示通过class属性定位元素
driver.find_element_by_css_selector(".s_ipt").send_keys(“css”)
driver.find_element_by_css_selector(".bg s_btn").click()
通过id定位元素
find_element_by_css_selector("#id值") id选择器选择id="a"的所有元素,#号表示通过id属性定位元素
driver.find_element_by_css_selector("#kw").send_keys(“huh”)
driver.find_element_by_css_selector("#su").submit()
通过标签名定位元素(少用)
find_element_by_css_selector(“input”)
通过标签属性定位
find_element_by_css_selector("[属性名=属性值]")
driver.find_element_by_css_selector("[ maxlength=‘255’]").send_keys(“dfaf”)
driver.find_element_by_css_selector("[ value=‘百度一下’]").submit()
对于属性值来说,可加引号,也可以不加,但注意和整个字符串的引号进行区分!!!
通过标签父子关系定位(少用吧)
find_element_by_css_selector(“父标签>子标签”)
find_element_by_css_selector(“span>input”)表示选择父标签为span的所有input元素
组合定位(通过父子标签和其属性结合)
组合定位可以大大加强定位元素的唯一性!
driver.find_element_by_css_selector(“form#form>span>input”).send_keys(“asfa”)
driver.find_element_by_css_selector(“form#form>span>input#su”).click()
要定位的元素是input,父元素是span,爷元素是form;
要定位的元素是input(可以结合它的属性值),父元素是span,爷元素是form(可以结合它的属性值)
其实通过css定位也可以像xpath定位那样通过firebug工具获得再修改,或选择要定位的标签后右键-》复制css路径也行。
各种方式在选择的时候应该怎么选择:
当页面元素有id属性时,最好尽量用id来定位。但由于现实项目中很多程序员其实写的代码并不规范,会缺少很多标准属性,这时就只有选择其他定位方法。
xpath很强悍,但定位性能不是很好,所以还是尽量少用。如果确实少数元素不好定位,可以选择xpath或cssSelector。
当要定位一组元素相同元素时,可以考虑用tagName或name。
当有链接需要定位时,可以考虑linkText或partialLinkText方式。
欢迎加入学习交流QQ群:657341423