一、Selenium介绍
Selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏 。
chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
Firefox:https://github.com/mozilla/geckodriver/releases
Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
二、安装Selenium
命令行输入:pip install selenium然后就是安装相应的浏览器就可以了。
三、Selenium操作
查找定位元素#查找单个元素:
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
# 查找多个元素
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
webdriver提供了定位一组元素的方法:
find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_xpath()
find_elements_by_css_selector()
find_elements_by_link_text()
find_elements_by_partial_link_text()
原来定位一组元素和定位一个元素基本一样,唯一不同的是elements复数。
定位一组元素用于:
批量操作元素,如勾选复选框checkbox、单选框radio。
先获取一组元素,再从这组元素对象中过滤出需要操作的元素,如定位页面所有的复选框,然后选择其中一个进行其他操作。
如操作下面一段代码:checkbox.html
<!DOCTYPE HTML> <html lang="ch-zh"> <head> <meta charset="utf-8"> <title>checkbox test~</title> <style type="text/css"> </style> </head> <body> <h2>选择你喜欢的食物:</h2> <form action="" method="get" id="myform"> <p> <label> <input type="checkbox" name="checkbox1" value="1">苹果 </label> <label> <input type="checkbox" name="checkbox2" value="2">栗子 </label> <label> <input type="checkbox" name="checkbox3" value="3">西瓜 </label> <label> <input type="checkbox" name="checkbox4" value="4">芒果 </label> <label> <input type="checkbox" name="checkbox5" value="5">芒果 </label> </p> <h2>你是男士还是女士:</h2> <p> <label> <input type="radio" name="sex" value="man">男士 </label> <label> <input type="radio" name="sex" value="woman">女士 </label> <label> <input type="radio" name="sex" value="no">保密 </label> </p> </form> </body> </html>
from selenium import webdriver import time driver = webdriver.Firefox() driver.get(r"http://192.168.225.137/html5/checkbox.html") #选择页面上所有tag_name是input的元素 inputs = driver.find_elements_by_tag_name("input") #然后过滤出type为checkbox的元素 for i in inputs: #用tag_name定位需要判断是否是checkbox,如下: if i.get_attribute("type") == "checkbox": i.click() time.sleep(1) inputs.pop().click() inputs.pop().click(2)
from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get(r"http://192.168.225.137/html5/checkbox.html") driver.set_window_size(1000,1000) #通过css定位 checkboxs = driver.find_elements_by_css_selector("[type='checkbox']") #通过xpath定位 inputs = driver.find_elements_by_xpath("//*[@type='checkbox']") #通过以上两种方式定位就不需要判断定位的标签是否是复选框的了 for i in checkboxs: i.click() sleep(1) #打印当前页面上input="checkbox" 的个数 print(len(inputs)) #把页面上第二个checkbox取到勾选 inputs.pop(1).click() sleep(2) driver.find_elements_by_xpath("//*[@type='checkbox']").pop(-1).click()
len()方法可以计算定位到的元素个数;
pop()方法获取列表中某个元素,pop().click()定位到某个checkbox后取消勾选;
pop()\pop(-1)都表示最后一个checkbox;
pop(0)第一个checkbox;
浏览器操作
打开网页、
driver.get("http://www.baidu.com")
定位输入框并输入文字
driver.find_element_by_id("kw").send_keys("selenium")
点击按钮
driver.find_element_by_id("su").click()
滚动到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
入门完整例子:
from selenium import webdriver import time #访问百度 driver=webdriver.Ie() driver.get("http://www.baidu.com") #搜索 driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() time.sleep(3) #将页面滚动条拖到底部 js="var q=document.documentElement.scrollTop=10000" driver.execute_script(js) time.sleep(3) #将滚动条移动到页面的顶部 js="var q=document.documentElement.scrollTop=0" driver.execute_script(js) time.sleep(3) #将页面滚动条移动到页面任意位置,改变等于号后的数值即可 js="var q=document.documentElement.scrollTop=50" driver.execute_script(js) time.sleep(10)若要对页面中的提示警告窗口中的滚动条进行操作,要先定位到该内嵌窗口,在进行滚动条操作
设置浏览器大小:
set_window_size(width,height)单位是像素点
maximize_window() 浏览器全屏显示,不带参数
控制浏览器前进、后退:
driver.forward()
driver.back()
模拟浏览器刷新:
driver.refresh()
例子:
from selenium import webdriver driver = webdriver.Firefox() driver.get(r"http://www.baidu.com/") #参数是像素点宽,高 driver.set_window_size(800,800) print("浏览器大小是800px,800px") driver.find_element_by_link_text("新闻").click() driver.back() #返回前一个页面 driver.forward() #前进前一个页面 driver.refresh() #刷新当前页面 driver.find_element_by_css_selector("#ww").send_keys("python3") driver.find_element_by_xpath("//*[@class='btn']").click() driver.refresh() #刷新当前页面 driver.quit()
send_keys("....") 模拟按键输入
click() 单击元素,前提是它是可以被单击的对象。
另外click()方法不仅可以用于单击一个按钮,它还能可以单击任何可以单击的文字、图片、checkbox、radio、select下拉框等。
submit() 用于提交表单,同样可以用于提交一个按钮。
WebElement接口常用方法
先看例子:
from selenium import webdriver driver = webdriver.Firefox() driver.get(r"http://www.baidu.com/") size = driver.find_element_by_name("wd").size print(size) #size属性,返回元素的尺寸,表单输入框之类的width、height等 text = driver.find_element_by_id("jgwab").text print(text) #text属性,获取元素的文本,可以用力判断打开的页面是否是预期的。 attribute = driver.find_element_by_xpath(".//input[@id='kw']").get_attribute('maxlength') print(attribute) #get_attribute()方法可以获取属性值 result = driver.find_element_by_partial_link_text("京公网安备").is_displayed() print(result) #is_displayed() 元素是否设置可见,可见返回true则false driver.quit()size属性返回元素尺寸
text属性返回元素文本
get_attribute()方法获取属性值
is_displayed()方法返回该元素是否设置可见
表单操作
操作输入框:分为两步。
第一步:找到这个元素。
第二步:使用send_keys(value),将数据填充进去
使用clear方法可以清除输入框中的内容
inputTag.clear()
操作checkbox
因为要选中checkbox标签,在网页中是通过鼠标点击的。因此想要选中checkbox标签,那么先选中这个标签,然后执行click事件
rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
操作按钮
操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击。直接调用click函数就可以了
inputTag = driver.find_element_by_id('su')
inputTag.click()
选择select
select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门为select标签提供了一个类selenium.webdriver.support.ui.Select。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使用这个对象进行选择了[1]。
示例,模仿输入用户名密码登录
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains #导入ActionChains类 driver = webdriver.Firefox() driver.get(r"https://baidu.com") driver.maximize_window() driver.find_element_by_xpath("//*[@name='account']").clear() driver.find_element_by_xpath("//*[@name='account']").send_keys("username.com") driver.find_element_by_name("password").clear() driver.find_element_by_name("password").send_keys("pwd") driver.find_element_by_xpath("//*[@id='login']/div/div[2]/form/p[4]/label/input").click() driver.find_element_by_xpath("//*[@id='login']/div/div[2]/form/p[5]/input").click()
鼠标操作
webdriver中对鼠标的操作的方法封装在ActionChains行为链类中 ,
有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件
使用前要先导入ActionChains类:
from selenium.webdriver.common.action_chains import ActionChainsActionChains类提供的鼠标操作常用方法:
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停
perform() 执行所有ActionChains类中存储的行为,可以理解为对整个操作的提交动作
actions = ActionChains(driver) actions.move_to_element(inputTag) actions.send_keys_to_element(inputTag,'python') actions.move_to_element(submitTag) actions.context_click() actions.click(submitTag) actions.perform()鼠标右键操作
#定位到需要右击的元素
right_click = driver.find_element_by_link_text("jemeter")
#对定位到的元素执行鼠标进行右键操作,调用ActionChains类,将浏览器驱动driver作为参数传入,context_click()需要指定元素位置
ActionChains(driver).context_click(right_click).perform()
鼠标双击操作
double_click()方法模拟鼠标双击操作
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Firefox() driver.get(r"http://www.baidu.com/") #定位需要双击的元素 double_click = driver.find_element_by_xpath("") #对定位到的元素进行双击操作 ActionChains(driver).double_click(double_click).perform() a = driver.find_element_by_class_name("") ActionChains(driver).double_click(a).perform()
from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Firefox() driver.get(r"http://www.baidu.com/") driver.set_window_size(1000,1000) #定位到悬停的元素 attrible = driver.find_element_by_link_text("设置") #对定位到的元素进行悬停操作 ActionChains(driver).move_to_element(attrible).perform() time.sleep(5) driver.refresh()
百度首页上的设置项,下面的菜单默认不会显示,将鼠标停在上面后才会显示,这就是鼠标的悬停操作,菜单显示以后就可以对下面的项进行点击操作
进入搜索设置的代码
# -*- coding: utf-8 -*- from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.baidu.com") time.sleep(3) settings = driver.find_element_by_link_text('设置') webdriver.ActionChains(driver).move_to_element(settings).perform() time.sleep(1) settings_search = driver.find_element_by_class_name('setpref') settings_search.click() time.sleep(3) driver.close()
webdriver.ActionChains(driver).drag_and_drop("拖动的起点元素", "拖动的终点元素").perform() #拖动事件
鼠标拖放操作
drag_and_drop(source,target) 在源元素上按住鼠标左键,然后移动到目标元素上释放。
source 鼠标拖动的源元素
target鼠标释放的目标元素
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Firefox() driver.get("http://www.baidu.com/") #定位元素的初始位置 source = driver.find_element_by_css_selector("") #定位元素的要移动到的位置 target = driver.find_element_by_name("") #执行元素的拖放操作 ActionChains(driver).drag_and_drop(source,target).perform()
键盘事件
Keys类中提供了几乎所有的键盘事件,在鼠标事件中用到了两个键盘事件,– Keys.BACK_SPACE:回退键(BackSpace)
– Keys.TAB:制表键(Tab)
– Keys.ENTER:回车键(Enter)
– Keys.SHIFT:大小写转换键(Shift)
– Keys.CONTROL:Control键(Ctrl)
– Keys.ALT:ALT键(Alt)
– Keys.ESCAPE:返回键(Esc)
– Keys.SPACE:空格键(Space)
– Keys.PAGE_UP:翻页键上(Page Up)
– Keys.PAGE_DOWN:翻页键下(Page Down)
– Keys.END:行尾键(End)
– Keys.HOME:行首键(Home)
– Keys.LEFT:方向键左(Left)
– Keys.UP:方向键上(Up)
– Keys.RIGHT:方向键右(Right)
– Keys.DOWN:方向键下(Down)
– Keys.INSERT:插入键(Insert)
– DELETE:删除键(Delete)
– NUMPAD0 ~ NUMPAD9:数字键1-9
– F1 ~ F12:F1 - F12键
– (Keys.CONT...
点击查看剩余70%
网友评论0