Python Selenium 定位详解

[TOC]

find_element_by_id()

采用id属性进行定位。例如在百度页面中输入关键字 Selenium 进行搜索。百度部分关键html源码如下: 在这里插入图片描述 百度输入框和百度一下的按钮都有id,那么定位代码如下:

#coding=utf-8
from selenium import webdriver
import time
 
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()

driver.find_element_by_name("wd")

find_element_by_class_name()

driver.find_element_by_class_name("s_ipt")

find_element_by_xpath()

xpath是XML路径语言,它可以用来确定xml文档中的元素位置,通过元素的路径来完成对元素的查找。HTML就是XML的一种实现方式,所以xpath是一种非常强大的定位方式。

获取xpath、css_selector路径方法

打开谷歌浏览器-->打开百度-->键盘点击F12--点击定位位置-->点击源码位置-->邮件copy 在这里插入图片描述

绝对路径

如百度搜索框的绝对路径xpath定位:

driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input")

相对路径

属性定位1

搜索框还可以利用id和name属性去定位:

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

标签名input也可以定位,只要在该标签内,任意属性都可以,比如搜索框的maxlength属性:

driver.find_element_by_xpath("//input[@maxlength='255']")
driver.find_element_by_xpath("//form[@id='form']/span/input")

注:如果元素的单个属性无法确定其唯一性,可以用and连接多个属性去确定

find_element_by_css_selector()

CSS属性定位可以比较灵活地选择控件的任意属性,定位方式也会比xpath快

driver.find_element_by_css_selector("#kw")
driver.find_element_by_css_selector(".s_ipt")

注:class是用.标记,id是用#标记

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

注:1."input[autocomplete='off']",autocomplete='off' 为input内属性值; 2."span.bg.s_btn_wr>input#su",先定位到一个class名为bg s_btn_wr的span标签,在这个标签下面有一个id为su的input标签 注:在css里面下级标签元素用>连接,如果class里面有空格,空格用.进行连接

find_element_by_tag_name ()

html标签,如input、a、form等 一般定位如下:find_element_by_tag_name("input"),因为一个html一个标签存在多个因此这种定位方式用的比较少

find_element_by_partial_link_text()

定位标签: html源码:

 <a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a>
#全部匹配
driver.find_element_by_link_text("新闻").click()
#部分匹配
driver.find_element_by_partial_link_text("闻").click()

Xpath&Css定位方法速查表

描述 Xpath Css
直接子元素 //div/a div > a
子元素或后代元素 //div//a div a
以id定位 //div[@id='idValue']//a div#idValue a
以class定位 //div[@class='classValue']//a div.classValue a
同级弟弟元素 //ul/li[@class='first']/following- ul>li.first + li
属性 //form/input[@name='username'] form input[name='username']
多个属性 //input[@name='continue' and input[name='continue'][type='button
第4个子元素 //ul[@id='list']/li[4] ul#list li:nth-child(4)
第1个子元素 //ul[@id='list']/li[1] ul#list li:first-child
最后1个子元素 //ul[@id='list']/li[last()] ul#list li:last-child
属性包含某字段 //div[contains(@title,'Title')] div[title*="Title"]
属性以某字段开头 //input[starts-with(@name,'user')] input[name^="user"]
属性以某字段结尾 //input[ends-with(@name,'name')] input[name$="name"]
text中包含某字段 //div[contains(text(), 'text')] 无法定位
元素有某属性 //div[@title] div[title]
父节点 //div/.. 无法定位
同级哥哥节点 //li/preceding-sibling::div[1] 无法定位

By定位

#By定位必备导入
from selenium.webdriver.common.by import 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") 

elements复数定位

说明:复数定位方式每次取到的都是具有相同类型属性的一组元素,所以返回的是一个list队列 在这里插入图片描述 如上图需要定位到时视频,再点击视频链接

#注意下标是从0开始,所以视频下标为3
driver.find_elements_by_class_name("mnav")[3].click()
#也可以借助pop()函数,一般pop()或pop(-1)表示获取元素种的最后一个,pop(3)表示第4个
driver.find_elements("css selector",".mnav").pop(3).click()

JS的定位

上面的定位方式应该就基本够用了,但是有的时候就是会出现一些异常的定位失效这个时候如果用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)

猜你喜欢

转载自www.cnblogs.com/yiwenrong/p/12665188.html
今日推荐