python + selenium 技术
这两天软件的一位同学,让我用 python 给他写一个挂机脚本。具体需求是:登录设备管理页面,进入指定页面,等待页面超时,再进行点击页面操作;之前这一块技术,自己学习过。但是坑爹的是,很长一段时间没使用,对于定位标签,竟然还需要去查找资料。此篇文章主要记录 selenium 相关技术,包括关于如何定位页面标签。省去以后查找资料的时间。
什么是 selenium?
selenium 是一个免费、开源、跨平台的自动化测试工具。selenium 主要分为 selenium1.0 和 selenium2.0,当然还有 selenium3.0。
其中 Selenium 1.0 = Selenium IDE + Selenium Grid + Selenium RC。Selenium RC(Remote Control)是 Selenium 家族的核心部分。Selenium RC 支持多种不同语言编写的自动化测试脚本,通过 Selenium RC 的服务器作为代理服务器去访问应用,从而达到测试的目的。Selenium RC 分为 Client Libraries 和 Selenium Server。Client Libraries 库主要用于编写测试脚本,用来控制 Selenium Server 的库。Selenium Server 负责控制浏览器行为。
webdriver 与 selenium 本身并不属于同一个项目,但后面两者的合并也促使 selenium2.0 的诞生。所以 selenium2.0=selenium1.0+webdriver。webdriver 可以看作是 selenium RC 的替代品。
Python(webdriver)=>Chromedriver=>Chrome
安装软件环境
安装 python3,进入 python 官网 ,选择 python3 进行下载。注意:windows 平台安装 python 时 d,需将添加到环境变量的选项勾选。
安装 selenium 包,cmd 或者终端中输入如下命令
pip install selenium
下载 webdriver,点击进入 淘宝 npm 。有人会问,为什么不用 npm?因为墙的缘故。点击 ChromeDriver 镜像选项,下载 Chromedriver。注意 chromedriver.exe 需要与 chrome 浏览器版本匹配。下载得到压缩包后,将解压得到的 Chromedriver.exe 放到 python 的环境变量路径下。
Mac 平台下环境变量设置
使用如下命令查看 MAC 的环境变量
echo $PATH
通过命令将 Chromedriver 复制至/usr/local/bin 目录下即可
cp /Users/fanhao/Downloads/chromedriver /usr/local/bin
Windows 平台下环境变量设置
如果之前安装 python3 时,已经勾选了添加到 path 中,则将下载得到 Chromedriver.exe 放到 python3 的路径下。
实例
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("http://192.168.1.1")
n=199
while n>0:
n=n-1
print(n)
driver.find_element_by_xpath("//input[@id='login-username']").send_keys("admin")
driver.find_element_by_xpath("//input[@id='login-password']").send_keys("password")
driver.find_element_by_xpath("//input[@id='submit']").click()
driver.find_element_by_xpath("//a[@href='./main.html#info']").click()
driver.switch_to_frame("menufrm")
driver.find_element_by_xpath("//a[@href='dslatm.cmd']").click()
time.sleep(300)
#driver.switch_to_frame("menufrm")
driver.find_element_by_xpath("//a[@href='wancfg.cmd']").click()
driver.refresh()
定位元素的方法
绝对定位
此方法最为简单,具体格式为
driver.find_element_by_xpath("绝对路径")
具体例子:
#x 代表第 x 个 div 标签,注意,索引从 1 开始而不是 0
driver.find_element_by_xpath("/html/body/div[x]/form/input")
此方法缺点显而易见,当页面元素位置发生改变时,都需要修改,因此,并不推荐使用
相对定位
相对路径,以‘//’开头,具体格式为
driver.find_element_by_xpath("//标签")
具体例子:
#定位第 x 个 input 标签,[x]可以省略,默认为第一个
driver.find_element_by_xpath("//input[x]")
相对路径的长度和开始位置并不受限制,也可以采取以下方法
#[x]依然是可以省略的
driver.find_element_by_xpath("//div[x]/form[x]/input[x]")
标签加属性定位
相对比较简单,也要求属性能够定位到唯一一个元素,如果存在多个相同条件的标签,默认只是第一个,具体格式如下
driver.find_element_by_xpath("//标签[@属性==‘属性值’]")
driver.find_element_by_xpath("//input[@type='name' and @name='kw1']")
xpath:模糊匹配
以定位百度页面的超链接“hao123”为例
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
#xpath 模糊匹配
driver.find_element_by_xpath("//*[contains(text(),'hao123')]").click()
#匹配含有 kw 属性值
driver.find_element_by_xpath("//*[contains(@id,'kw')]").send_keys("xpath")
#匹配 id 值为 kw 开头的属性
driver.find_element_by_xpath("//*[starts-with(@id,'kw')]").send_keys("test")
附录
python 相关
#coding=utf8
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("http://192.168.100.23/test.html")
#textfield
driver.find_element_by_xpath("//input[@data-name]").send_keys('test')
#radio
driver.find_element_by_xpath("//radio[@data-male]").click()
time.sleep(1)
driver.find_element_by_xpath("//radio[@data-female]").click()
#checkbox
driver.find_element_by_xpath("//checkbox[@data-bike]").click()
driver.find_element_by_xpath("//checkbox[@data-car]").click()
#select
driver.find_element_by_xpath("//select[@data-select]").click()
#texarea
driver.find_element_by_xpath("//textarea[@data-textarea]").send_keys('Te')
#a tag
driver.find_element_by_xpath("//a[@data-href]").click()
#div
driver.find_element_by_xpath("//input[@data-divinput]").send_keys('test')
#submit
driver.find_element_by_xpath("//input[@data-submit]").click()
ruby 相关
#以下为 ruby-2.0.0p195 + watir-webdriver-0.9.9 + selenium
require 'watir-webdriver'
b=Watir::Browser.start("192.168.100.23/test.html",:chrome)
b.text_field(:xpath=>'//input[@data-name]').send_keys('test') #配置值
#b.text_field(:xpath=>'//input[@data-name]').value #获取值
#radio
b.radio(:xpath=>'//input[@data-female]').click()
b.input(:xpath=>'//input[@data-female]').click()
#checkbox
#checkbox
b.checkbox(:xpath=>'//input[@data-bike]').set() #选中
#b.checkbox(:xpath=>'//input[@data-bike]').clear() #取消选中
#选取 value 值
b.select(:xpath=>'//select[@data-select]').select_value('saab')
#选择 Text
b.select(:xpath=>'//select[@data-select]').select('Audi')
#b.select(:xpath=>'//select[@data-select]').value #获取选中的 value
#textarea
b.textarea(:xpath=>'//textarea[@data-textarea]').send_keys('TTTTT')
#a 标签
b.a(:xpath=>'//a[@data-href]').click()
#按钮
b.button(:xpath=>'//input[@data-submit]').click()
b.input(:xpath=>'//input[@data-submit]').click()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论