python+selenium之操作大全及操作案例解析

一、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/

python+selenium之操作大全

二、安装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>



把checkbox复选框全部选择:

find_elements_by_tag_name()定位,需要判断是否是checkbox

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)



通过find_elements_by_xpath()和find_elements_by_css_selector()直接定位到checkbox:

不需要判断了,选择所有的复选框后取消第二个和最后一个:

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()



#前面已经把所有checkbox勾上了,通过pop().click()对某个checkbox再勾选,即是取消勾选。

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()


clear()清除文本

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 ActionChains

ActionChains类提供的鼠标操作常用方法:

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()

鼠标悬停

move_to_element()方法模拟鼠标悬停

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()

打开页面后,根据链接的文本信息找到设置项,使用ActionChains的move_to_element()方法将鼠标悬停在设置上,然后找到搜索设置项

鼠标的右击、双击和拖动事件都是通过上述的方法调用,只要将方法替换一下就可以了。

拖动事件需要传入两个参数,第一个参数是拖动的起点元素,第二个参数是终点元素

webdriver.ActionChains(driver).context_click("右击的元素定位").perform() #右击事件

webdriver.ActionChains(driver).double_click("双击的元素定位").perform() #双击事件

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类中提供了几乎所有的键盘事件,在鼠标事件中用到了两个键盘事件,

键盘的向下按键(send_keys(Keys.DOWN))和键盘的回车事件(send_keys(Keys.ENTER))。

键盘的事件需要导入Keys模块

from selenium.webdriver.common.keys import Keys

所有的键盘事件都包含在这个模块中,send_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%

{{collectdata}}

网友评论0