1,基本8种定位方法
以百度网站为例
<span class="bg s_ipt_wr quickdelete-wrap">
<span class="soutu-btn"></span>
<input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">
<a id="quickdelete" class="quickdelete" href="javascript:;" title="清空" style="top: 0px; right: 0px; display: none;"></a>
</span>
<span class="bg s_btn_wr">
<input id="su" class="bg s_btn" type="submit" value="百度一下">
</span>
# 通过id 查找
find_element_by_id()
# 通过class name 和 name 查找
find_element_by_name()
find_element_by_class_name()
根据name元素和class的名字进行定位,这两种定位方式和id定位相似,在前端代码中,id、name和class一般都至少会有其中的一种,比如百度的搜索框具有name属性,我们可以用name定位搜索款,class定位百度一下的按钮
from selenium import webdriver
import 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(
# 通过xpth 查找
find_element_by_xpath()
xpath是XML路径语言,它可以用来确定xml文档中的元素位置,通过元素的路径来完成对元素的查找。HTML就是XML的一种实现方式,所以xpath是一种非常强大的定位方式。
xpath也分几种不同类型的定位方法。
一种是绝对路径定位。这种定位方式是利用html标签名的层级关系来定位元素的绝对路径,一般从<html>标签开始依次往下进行查找。
如百度搜索框的绝对路径xpath定位可以是这样的:
find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input")
# 通过tag_name查找
find_element_by_tag_name ()
通过标签名去定位的方式一般是这样的:find_element_by_tag_name("input")
可见仅仅通过标签名去定位时,一般一种标签在一个页面里面会出现不止一次甚至大量出现,这种定位方式的作用不是很大,所以用的也就比较少。
#通过链接定位查询,这两种定位方式是专门用于定位超链接的
find_element_by_link_text()
find_element_by_partial_link_text()
这两种定位方式是专门用于定位超链接的,也就是对应html页面中的<a>标签,括号里传的值就是a标签中的超链接文字,两者的区别在于一个是完整的超链接文字,一个是可以只写部分超链接文字。
比如点击百度首页中右上角的新闻超链接,可以这样去定位:
driver.find_element_by_link_text("新闻").click()
driver.find_element_by_partial_link_text("闻").click()
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()
同样是那个百度搜索的例子,可以试一下:
二,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, class="mnav"。
举个例子,比如定位排在第六个的学术,可以这样定位:driver.find_elements_by_class_name("mnav")[5].click() #单独定位
还可以通过css的复数定位写法:driver.find_elements("css selector",".mnav")[6].click() #单独定位
当然,也可以借助pop()函数,一般pop()或pop(-1)表示获取元素种的最后一个,pop(2)表示第三个:
driver.find_elements("css selector",".mnav").pop().click() #单独定位
三,超神的jQuery定位
先了解一下css选择器的内容:
jquery选择器
例:
from selenium import webdriver
from time import sleep
dr = webdriver.Chrome()
dr.get(“https://www.jianshu.com/sign_in“)
sleep(2)
”’
JQuery定位:$(‘css_selector的语法’).操作方式
操作方式 .val(“值”) .click()
”’
**#1、根据id定位
jq_userName = “$(‘#session_email_or_mobile_number’).val(‘userName’)”
dr.execute_script(jq_userName)
sleep(2)
**#2、根据type定位
jq_userName2 = “$(‘:text’).val(‘type’)”
dr.execute_script(jq_userName2)
sleep(2)
**#3 根据class定位
**#jq_loginBtn = “$(‘.sign-in-button’).click()”
**#dr.execute_script(jq_loginBtn)
**#4、按层级定位
**#带有标签的层级定位
jq_userName3 = “$(‘div.input-prepend.restyle.js-normal > input#session_email_or_mobile_number’).val(‘userName3’)”
dr.execute_script(jq_userName3)
sleep(2)
**#2)不带有标签的层级定位
jq_userName4 = “$(‘.input-prepend.restyle.js-normal > #session_email_or_mobile_number’).val(‘userName4’)”
dr.execute_script(jq_userName4)
sleep(2)
**#3)、不带层次符
jq_userName5 = “$(‘.input-prepend.restyle.js-normal #session_email_or_mobile_number’).val(‘userName5’)”
dr.execute_script(jq_userName5)
sleep(2)
**#4)、选择最后一个元素
jq_userName6 = “$(‘div.input-prepend.restyle.js-normal > input:last’).val(‘userName6’)”
dr.execute_script(jq_userName6)
sleep(2)
**#5)、选择指定元素 标签:eq(索引位) – 从0开始
jq_userName7 = “$(‘div.input-prepend.restyle.js-normal > input:eq(0)’).val(‘userName7’)”
dr.execute_script(jq_userName7)
sleep(2)
**#6)、选择指定元素 标签:nth-child(序号) – 从1开始
jq_userName8 = “$(‘div.input-prepend.restyle.js-normal > input:nth-child(1)’).val(‘userName8’)”
dr.execute_script(jq_userName8)