1,安装selenium库

pip install selenium

2,下载浏览器驱动,放置python目录下

1,查看浏览器当前版本的版本

java 如何将selenium 使用到的浏览器置于屏幕最前面_Chrome

java 如何将selenium 使用到的浏览器置于屏幕最前面_css_02

2,不同的浏览器需要对应的浏览器驱动,示例为谷歌浏览器驱动

https://npm.taobao.org/mirrors/chromedriver/

java 如何将selenium 使用到的浏览器置于屏幕最前面_css_03

 ps:下载的浏览器版本号接近都可以使用

3,把下载的压缩包解压的“chromedriver.exe”,放置python目录下

 

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_04

 4,启动谷歌浏览器

from selenium import webdriver

driver = webdriver.Chrome() # 启动谷歌浏览器

java 如何将selenium 使用到的浏览器置于屏幕最前面_选择器_05

2,查看页面元素方法

页面鼠标右键,点击检查,或者直接按F12

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_06

java 如何将selenium 使用到的浏览器置于屏幕最前面_选择器_07

 

java 如何将selenium 使用到的浏览器置于屏幕最前面_选择器_08

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_09

3,selenium 基础定位方法

根据HTML语言的页面元素进行定位,以百度搜索页面练习实例

1,id 定位

HTML中id的作用是为单元(元素,标签)提供唯一的标识或标记

定位输入框的id值:"kw"

java 如何将selenium 使用到的浏览器置于屏幕最前面_css_10

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_id("kw").send_keys("selenium")

2,name 定位

id 或 name 属性的值可以是引号引起来的任何字符串。字符串必须是唯一的标记,不能在同一文档中的其他 name 或 id 属性中重复使用,但是可以在不同的文档中再次使用。

定位输入框的name值:"wd"

java 如何将selenium 使用到的浏览器置于屏幕最前面_选择器_11

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_name('wd').send_keys('selenium')

3,class 定位

class 属性定义了元素的类名,可以通过类名进行定位

定位输入框的class值:"s_ipt"

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_12

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_class_name('s_ipt').send_keys('selenium')

4,tag 定位

java 如何将selenium 使用到的浏览器置于屏幕最前面_Chrome_13

from selenium import webdriver
import time
driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

time.sleep(3)
driver.find_element_by_tag_name('input').send_keys('selenium')

ps:通过tag name来定位失败了。主要是tag name有很多重复的,造成了选择tag name来定位页面元素不准确,所以使用这个方法定位web元素的机会很少。

5,link 定位

link可以通过带文本的链接进行定位

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_14

from selenium import webdriver
import time
driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_link_text('新闻').click()

6,partial link 定位

partial link 相比于link 可以定位更长的文本截取部分定位

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_15

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://baike.baidu.com/item/bilibili/7056160?fromtitle=bilbili&fromid=20177274&fr=aladdin')

driver.find_element_by_partial_link_text('电竞信息科技有限公司').click()

7,XPath定位

在xml文档中,Xpath是一种定位元素的语言

1,页面检查,查看获取xpath的方法

java 如何将selenium 使用到的浏览器置于屏幕最前面_选择器_16

  • 复制 XPath为相对路径
  • 复制完整 XPath为绝对路径定位

2,XPath 指定标签名,进行定位

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

# 指定input标签名,进行定位
driver.find_element_by_xpath('//input[@id="kw"]').send_keys("selenium")
# driver.find_element_by_xpath('//input[@name="wd"]').send_keys("selenium")
# driver.find_element_by_xpath('//input[@class="s_ipt"]').send_keys("selenium")

3,XPath 不指定标签名,可以用 “ * ” 匹配

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

# 不指定标签名,可以用*匹配
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("selenium")
# driver.find_element_by_xpath('//*[@name="wd"]').send_keys("selenium")
# driver.find_element_by_xpath('//*[@class="s_ipt"]').send_keys("selenium")
# driver.find_element_by_xpath('//*[@id="s-top-left"]/a[1]').click()

4,XPath 层级与属性结合

层级与属性结合,如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以查找其上一级元素。如果它的上一级元素可以唯一标识属性的值,就可以拿来用

java 如何将selenium 使用到的浏览器置于屏幕最前面_选择器_17

 1,获取的XPath值

//*[@id="form"]/span[1]

 2,补充我们要定位的input标签

//*[@id="form"]/span[1]/input
from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

# 层级与属性结合,如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以查找其上一级元素。
# 如果它的上一级元素可以唯一标识属性的值,就可以拿来用
driver.find_element_by_xpath('//*[@id="form"]/span[1]/input').send_keys('selenium')
#driver.find_element_by_xpath('//*[@id="s-top-left"]/a').click()

 5,XPath 绝对路径定位

绝对路径就是一级一级的从/html/.../a[1]  一直到定位的元素

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://baike.baidu.com/item/bilibili/7056160?fromtitle=bilbili&fromid=20177274&fr=aladdin')

# xpath 绝对路径定位
driver.find_element_by_xpath('/html/body/div[3]/div[2]/div/div[1]/div[35]/a[1]').click()

6,XPath 使用逻辑运算符

如果一个属性不能唯一区分一个元素,可以使用逻辑运算符连接多个属性进行元素匹配

java 如何将selenium 使用到的浏览器置于屏幕最前面_选择器_18

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_xpath('//*[@id="kw" and @class="s_ipt"]').send_keys('selenium')

7, XPath 使用contains 方法

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_19

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_xpath('//*[contains(@class,"s_ipt")]/input').send_keys('selenium')

8,XPath 使用contains结合text() 方法

text() 方法用于匹配显示文本信息

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_xpath('//*[contains(text(),"新闻")]').click()

ps:直接使用text() 比较难定位QAQ

9,部分属性值匹配 ( 模糊匹配)

部分属性值匹配

# 匹配id以test开头的元素,id='test'
driver.findElement(By.xpath("//input[start-with(@id,'test')]"));

# 匹配id以test结尾的元素,id='test'
driver.findElement(By.xpath("//input[ends-with(@id,'test')]"));

# 匹配id中含有test的元素,id='test'
driver.findElement(By.xpath("//input[contains(@id,'test')]"));

10,使用任意值来匹配属性及元素,匹配所有input元素中含有属性的值为test的元素

driver.findElement(By.xpath("//input[@*='test']"));

11,XPath 注意定位路径里的单双引号

ps:注意 python的语法规则 双引号里面不能有双引号,同样单引号里面不能单引号,但是可以两者结合使用;

java 如何将selenium 使用到的浏览器置于屏幕最前面_选择器_20

 正确的写法

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_21

8,CSS 定位

css 用于描述HTML样式,可以通过css选择器绑定html的属性(id,class...)进行元素定位

1,css 选择器语法

选择器

例子

作用

.class

.s_ipt

class 选择器,选择 class=".s_ipt"的所有元素

#id

#kw

id 选择器,选择 id="kw"的所有元素

*

*

选择所有元素

element

p

选择所有<p>元素

element > element

div > input

选择父元素为 <div>的所有 <input> 元素

element + element

div + input

选择同一级中紧接在 <div> 元素之后的所有 <input> 元素

[attribute=value]

[target=_blank]

选择 target="_blank" 的所有元素

2,通过class 定位

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_css_selector(".s_ipt").send_keys("selenium")

3,通过id 定位

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_css_selector("#kw").send_keys("selenium")

4,通过标签名进行定位

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

#driver.find_element_by_css_selector("input").send_keys("selenium")

 ps:存在多个重复标签,容易导致无法识别,不太推荐直接使用标签定位

5,通过标签层级关系进行定位

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_22

span > input

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_css_selector("span > input").send_keys("selenium")

6,通过属性定位

java 如何将selenium 使用到的浏览器置于屏幕最前面_css_23

1,定位输入框

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_css_selector('[name="wd"]').send_keys("selenium")
# driver.find_element_by_css_selector('[autocomplete="off"]').send_keys("selenium")
# driver.find_element_by_css_selector('[maxlength="255"]').send_keys("selenium")

2,定位按钮

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_24

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_css_selector('[name="wd"]').send_keys("selenium")

driver.find_element_by_css_selector('[type="submit"]').click()

7,组合定位

1,id组合

java 如何将selenium 使用到的浏览器置于屏幕最前面_css_25

 form#form > span > input#kw

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_css_selector('form#form > span > input#kw').send_keys("selenium")

2,class组合 

 

java 如何将selenium 使用到的浏览器置于屏幕最前面_Chrome_26


form.fm > span > input.s_ipt


from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_css_selector('form.fm > span > input.s_ipt').send_keys("selenium")

8,css其他的定位方法

1, * 查找class包含s_ipt_wr的元素

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')
# * 查找class包含s_ipt_wr的元素
driver.find_element_by_css_selector("[class*=s_ipt_wr]").send_keys("selenium") 
# 不知道为啥定位不到QAQ

2, ^ 查找class以s_ipt开头的元素

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

# ^ 查找class以s_ipt开头的元素
driver.find_element_by_css_selector("[class^=s_ipt]").send_keys("selenium")

3, $ 查找class结尾为s_btn的元素

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')


# $ 查找class结尾为s_btn的元素
driver.find_element_by_css_selector("[class^=s_ipt]").send_keys("selenium")
driver.find_element_by_css_selector("[class$=s_btn]").click()

 4, 通过检查,直接复制 selector

java 如何将selenium 使用到的浏览器置于屏幕最前面_selenium_27

#kw

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_css_selector("#kw").send_keys('selenium')

 input#kw

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_css_selector("input#kw").send_keys('selenium')

4,以find_element() 方法进行定位

ps: 使用基础,xpath,css方法进行定位时会警示: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
原因:弃用警告:不推荐使用 find_element_by_* 命令。 请改用 find_element()

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element("id","kw").send_keys("selenium")
# driver.find_element("name",'wd').send_keys('selenium')
# driver.find_element("class name","s_ipt").send_keys('selenium')
# driver.find_element("tag name","input").send_keys('selenium')
# driver.find_element("link text","新闻").click()

# driver.get('https://baike.baidu.com/item/bilibili/7056160?fromtitle=bilbili&fromid=20177274&fr=aladdin')
# driver.find_element("partial link text", "电竞信息科技有限公司").click()

# driver.find_element("xpath", '//*[@id="kw"]').send_keys("selenium")
# driver.find_element("css selector", '#kw').send_keys("selenium")

5,用 By 定位元素

WebDriver 还提供另外一套写法,即统一调用find_element() 方法,通过By来声明定位,并且传入对应的定位参数

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element(By.ID, "kw").send_keys("selenium")
#driver.find_element(By.NAME, "wd").send_keys("selenium")
#driver.find_element(By.CLASS_NAME, "s_ipt").send_keys("selenium")
#driver.find_element(By.TAG_NAME, "input").send_keys("selenium") # 存在重复input,无法识别
#driver.find_element(By.LINK_TEXT, "新闻").click()
#driver.find_element(By.PARTIAL_LINK_TEXT, "地").click()
#driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys("selenium")
#driver.find_element(By.CSS_SELECTOR, '#kw').send_keys("selenium")

6,通过javasrcip 进行定位

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

# id定位:document.getElementById()
js = "document.getElementById('kw').value='selenium';"
driver.execute_script(js)

# name定位:document.getElementsByName()
# js = "document.getElementsByName('wd')[0].value='selenium';"
# driver.execute_script(js)

# class定位:document.getElementsByClassName()
# js = "document.getElementsByClassName('s_ipt')[0].value='selenium';"
# driver.execute_script(js)

# css定位:document.querySelectorAll()
# js2 = "document.querySelectorAll('#su')[0].click();"
# driver.execute_script(js2)

7,通过jQuery 定位

JQ1 = "$('#kw').val('selenium')"
JQ2 = "$('.s_btn').click()"
driver.execute_script(JQ1)
driver.execute_script(JQ2)

总结:

1,selenium 定位的方法很多,写自动化脚本时需,尽量定位唯一标识的元素;

2,tag 定位没一个是成功的emmm,无法定位,成功率太低了=/=

3,还不大理解 find_elements() 的用法 emmm 看看能不能后面学习到再补充完整

4,后面能搞定动态元素的定位就好了0.0