一、自动化介绍
1.1、自动化本质:
用代码模拟鼠标或键盘对浏览器进行操作
其中包含三个对象:代码,浏览器,浏览器驱动,三者关系:
代码驱动浏览器驱动
浏览器驱动解析代码,并驱动浏览器
浏览器按指令操作
1.2、环境配置:
1.2.1 安装浏览器
检查系统有无浏览器,没有则安装(建议先查看有没有对应的驱动,根据驱动版本下载相应的浏览器)
1.2.2 安装浏览器对应的驱动,并将驱动文件放到python安装目录下
查看浏览器版本,根据浏览器版本下载驱动,将.exe文件放至python安装路径下
1.2.3 安装selenium
ctrl+r -->cmd-->pip install selenium
1.2.4 检查环境
from selenium import webdriver
driver=webdriver.Chrome()
运行后弹出窗口,打开浏览器则环境配置成功
环境配置成功后就可以进行相关操作了。
二、元素定位
2.1 Web页面的元素
1)图片
2)链接
3)文本框
4)按钮
5)下拉列表
6)视频
……
比如百度的首页,在这张页面上有输入框、按钮和文字链接等,自动化要做的就是模拟鼠标和键盘来操作这些元素,或单击,或输入等。 操作这些元素的前提是要找到它们,如何来找到它们?这就需要用到元素定位的方法来找到相应的元素再进行操作
2.2 元素定位的方法
1)id
2)name
3)class name
4)tag name
5)link text
6)partial link text
7)css selector
8)xpath
2.2.1 id&name&class name元素定位
ID定位
HTML规定id属性在HTML文档中必须是唯一的,类似于公民的身份证号,具有很强的 唯一性。WebDriver提供的id定位方法:find_element(By.ID,'id')
Name定位:
HTML规定name来指定元素名称,因此它的作用更像是人的姓名。name的属性值,在当前 页面中可以不唯一:find_element(By.NAME,'name')
Classname定位:
HTML规定class来指定元素的类名,通过class属性来定位:find_element(By.CLASS_NAME,'classname')
eg:
driver.find_element(By.ID,'s-usersetting-top').click()
driver.find_element(By.NAME,'wd').send_keys('python')
driver.find_element(By.CLASS_NAME,'s_ipt').send_keys('selenium')
2.2.2 tag name & link text & partial link text & css selector元素定位
Tag定位:
HTML的本质就是通过tag来定义实现不同的功能,每一个元素本质上也是一个tag。因为一个 Tag往往用来定义一类功能,所以通过tag识别某个元素的概率很低。例如我们打开任意一个页面, 查看前端都会发现大量的<div>、<input>、<a>等tag,所以很难通过tag name去区分不同的 元素。定位方法:find_element(By.TAG_NAME,'tagname')
link text & partial link text定位:
Link text定位
是定位标签文本信息的一种方式,使用:find_element (By.LINK_TEXT.'text')
partial link 定位
是对link定位的一种补充,有些文本链接会比较长,这时候我们可以取文本链接的一部分定位,只要这部分信息可以唯一的标识这个链接,如果重复,会取第一个定位到的元素。定位方法:find_element(By.PARTIAL_LINK_TEXT,'partial text')
css selector元素定位
css_selector元素定位方法的使用方法较为复杂,且有局限性,需要在class前加#,在类前加.原内容为空格的需要用-填充
eg:
driver.find_element(By.CSS_SELECTOR,'i.c-icon.c-select-arrow').click()
eg:
driver.find_element(By.LINK_TEXT,'高级搜索').click()
driver.find_element(By.PARTIAL_LINK_TEXT,'搜索').click()
driver.find_element(By.CSS_SELECTOR,'i.c-icon.c-select-arrow').click()
2.2.3 xpath元素定位
以上的元素定位方式均会有定位不到的时候,这时候就需要xpath元素定位方式,顾名思义,xpath就是根据元素的路径去定位,每个元素都会有对应的路径,因此用这种方法基本能定位到所有元素。
Xpath可以分为以下几种定位方法。
绝对路径定位:find_element_by_xpath(“/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input”)
利用元素属性定位:
find_element_by_xpath(“//input[@id=‘kw’]”)
层级与属性结合:
find_element_by_xpath(“//form[@id='form']/span[1]/input”)
使用逻辑运算符:
find_element_by_xpath (“//input[@id=‘kw’ and @class=‘su’]”)
eg:
driver.find_element(By.XPATH,'//*[@id="adv-setting-gpc"]/div/div[2]/div[2]/p[3]').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="adv-setting-8"]/input').click()
driver.find_element(By.XPATH,"//div[@class='s-top-left-new s-isindex-wrap']/a[6]").click()
实例:
1.密码为空登录‘目标网址’
2.用户名密码不匹配登录‘目标网址’
3.获取提示内容
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.maximize_window()
driver.get('目标网址')
#密码为空登录
driver.find_element(By.XPATH,"//input[@class='text_cmu'][1]").send_keys('13800138006')
driver.find_element(By.XPATH,"//input[ @id='password']").send_keys('')
driver.find_element(By.XPATH,"//input[ @id='verify_code']").send_keys('1234')
driver.find_element(By.XPATH,"//a[@class='J-login-submit']").click()
time.sleep(2)
tt=driver.find_element(By.XPATH,"//div[@class='layui-layer-content layui-layer-padding']").text
print(tt)
driver.quit()
以上就是常用的8中元素定位方法,大多数元素可以用以上方法定位到,如果有特殊元素无法定位,可以参考xpath的轴定位方式。