Selenium元素综合操作

本文将介绍Selenium如下操作内容

  • 鼠标与键盘操作
  • 文件上传下载
  • Cookie设置
  • 窗口操作
  • 元素等待
  • checkbox元素操作
  • 滚动条操作

鼠标与键盘操作

鼠标操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep

driver=webdriver.Firefox()

driver.get("http://www.baidu.com")
driver.maximize_window()

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

# 获取搜索框元素对象
element=driver.find_element_by_css_selector("#kw")

sleep(3)
#双击操作
ActionChains(driver).double_click(element).perform()

sleep(2)

#右击操作
ActionChains(driver).context_click(element).perform()

sleep(3)

#鼠标悬停
above=driver.find_element_by_css_selector(".pf")
ActionChains(driver).move_to_element(above).perform()

sleep(4)
driver.quit()

键盘操作

测试案例

  • 在百度搜索关键词“Python”
  • 然后将关键词复制或剪切到搜狗搜索框进行搜索

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

driver=webdriver.Firefox()

driver.get("http://www.baidu.com")
driver.find_element_by_css_selector("#kw").send_keys("Python")

sleep(2)
#键盘全选操作 Ctrl+A
driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL,'a')

#键盘选择复制或剪切操作 Ctrl+C
driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL,'c')
driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL,'x')

#打开搜狗页面
driver.get("http://www.sogou.com/")
sleep(2)

#粘贴复制内容
driver.find_element_by_css_selector(".sec-input").send_keys(Keys.CONTROL,'v')
sleep(2)

#点击搜索按钮
# driver.find_element_by_xpath("//input[@id='stb']").click()
driver.find_element_by_css_selector("#stb").click()


sleep(3)
driver.quit()

还有一种特殊情况,如果出现元素不能聚焦的error: cannot focus element可以执行如下代码:

1
2
3
4
5
action = ActionChains(self.driver)
el=self.find_element(self.volume_button_high)

action.move_to_element(el)
action.send_keys(Keys.UP).perform()

注意:Mac端不能Ctrl+和win环境不一样,需要使用COMMAND

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import time
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com/')
time.sleep(3)

driver.find_element(By.ID,'kw').send_keys('selenium')
time.sleep(2)

#Mac端不能使用CONTROL而是COMMAND
driver.find_element(By.ID,'kw').send_keys(Keys.COMMAND,'a')
time.sleep(2)
driver.find_element(By.ID,'kw').send_keys(Keys.COMMAND,'x')
time.sleep(2)
driver.find_element(By.ID,'kw').send_keys(Keys.COMMAND,'v')
time.sleep(2)
driver.find_element(By.ID,'kw').send_keys(Keys.ENTER)
time.sleep(2)
driver.close()

常用键盘事件

  • 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.CONTROL, ‘a’):组合键Control+a,全选
  • (Keys.CONTROL, ‘c’):组合键Control+c,复制
  • (Keys.CONTROL, ‘x’):组合键Control+x,剪切
  • (Keys.CONTROL, ‘v’):组合键Control+v,粘贴

文件上传下载

文件上传

1
2
3
4
5
6
7
8
from selenium import webdriver
import os

driver=webdriver.Firefox()
file_path="file:///E:\\Desktop\\seleniumCode\\upfile.html"
driver.get(file_path)

driver.find_element_by_name("file").send_keys("E:\\Desktop\\seleniumCode\\open_gzb.py")

文件下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#下载文件
driver.get("http://jmeter.apache.org/download_jmeter.cgi")


#浏览器下载属性设置
fp=webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList",2) #设置浏览器下载路径,0表示默认,2表示指定路径
fp.set_preference("browser.download.manager.showWenStarting",True) #是否显示开始
fp.set_preference("browser.download.dir","E:\\Desktop") #指定下载保存的路径

driver=webdriver.Firefox(firefox_profile=fp)
driver.get("http://jmeter.apache.org/download_jmeter.cgi")
driver.find_element_by_partial_link_text("apache-jmeter-3.0.tgz").click()

Cookie设置

Cookie是储存在用户本地终端上的数据,实际上是一小段的文本信息,帮助 Web 站点保存有关访问者的信息,方便用户的访问。

案例:

查看和添加访问我要自学网的Cookie内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from selenium import webdriver

driver=webdriver.Firefox()
driver.get("http://www.51zxw.net/")

#获取cookie全部内容
cookie=driver.get_cookies()
#打印全部cookile信息
print(cookie)
#打印cookie第一组信息
print(cookie[0])


#添加cookie
driver.add_cookie({'name':'51zxw','value':'www.51zxw.net'})
for cookie in driver.get_cookies():
print("%s --- %s" %(cookie['name'],cookie['value']))

driver.quit()

窗口操作

窗口操作主要包括窗口的前进,后退、刷新、已经多个窗口操作。

打开页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from selenium import webdriver
import time

driver=webdriver.Firefox()
print("打开拓维首页")
driver.get("http://www.talkweb.com.cn")

#print("设置浏览器宽480 高800 ")
#driver.set_window_size(480,800)

#打开联系我们页面
print("打开联系我们页面")
driver.get("http://www.talkweb.com.cn/contact/")

time.sleep(3)

页面访问前进/后退相关操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#回退到首页
print("回退到首页")
driver.back()

time.sleep(3)

#前进到联系我们页面
print("前进到联系我们页面")
driver.forward()

print("刷新当前页面")
driver.refresh()

print("显示当前页面标题")
title=driver.title
print(title)

print("显示当前URL")
now_url=driver.current_url
print(now_url)

多窗口切换

案例:打开我要自学网Selenium课程主页,然后打开2-1课程详情页面,再回到课程主页打开3-1课程详情页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from selenium import webdriver
from time import sleep

driver=webdriver.Firefox()

#打开Selenium课程页面
driver.get("http://www.51zxw.net/list.aspx?cid=615")
# 获取课程主页的窗口句柄
selenium_index=driver.current_window_handle

sleep(2)
#点击2-1课程链接。进入课程详情页面
driver.find_element_by_partial_link_text('2-1').click()
sleep(4)

#跳转到课程主页窗口,点击3-1课程
driver.switch_to.window(selenium_index)
sleep(3)
driver.find_element_by_partial_link_text('3-1').click()
sleep(3)

driver.quit()

警告弹窗处理

案例:点击百度首页设置按钮,然后进入搜索设置页面,点击“保存设置”或“恢复默认”按钮,处理警告弹窗窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

from selenium import webdriver
from time import sleep

driver=webdriver.Firefox()
driver.get("http://www.baidu.com")

driver.find_element_by_link_text('设置').click()
sleep(2)
driver.find_element_by_link_text('搜索设置').click()
sleep(3)

driver.find_element_by_link_text('保存设置').click()
# driver.find_element_by_link_text('恢复默认').click()
sleep(3)

#处理警告窗口
alert_window=driver.switch_to_alert()
alert_window.accept()
sleep(2)


sleep(2)
driver.quit()

元素等待

概念

  • 显示等待是针对某一个元素进行相关等待判定;
  • 隐式等待不针对某一个元素进行等待,全局元素等待。

相关模块

  • WebDriverWait 显示等待针对元素必用
  • expected_conditions 预期条件类(下面很多方法可以调用,用于显示等待)
  • NoSuchElementException 用于隐式等待抛出异常
  • By 用于元素定位

模块引用

1
2
3
4
5
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException

显示等待

案例

检测百度页面搜索按钮是否存在,存在就输入关键词“自学网 Selenium” 然后点击搜索

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

from time import sleep

driver=webdriver.Firefox()

driver.get("http://www.baidu.com")


driver.find_element_by_css_selector(".s_ipt").send_keys("自学网 Selenium")

sleep(2)

#显示等待--判断搜索按钮是否存在
element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"su")))
element.click()
sleep(3)

driver.quit()

隐式等待

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import sleep,ctime

driver=webdriver.Firefox()
driver.get("http://www.baidu.com")

sleep(2)

driver.implicitly_wait(5) #隐式等待时间设定 5秒

#检测搜索框是否存在
try:
print(ctime())
driver.find_element_by_css_selector("#kw22").send_keys("Python")
except NoSuchElementException as msg:
print(msg)
finally:
print(ctime())

sleep(3)
driver.quit()

isdisplay()方法来判断

1
2
3
4
5
6
7
8
9
10
11
12
#用displayed 来判断元素是否显示
print(ctime)
for i in range(10):
el=driver.find_element_by_id("kw23")
try:
if el.isdisplyed():
break
except:pass
else: #注意 有try except嵌套时,if else 不一定是和if对其
print("timeout")
print(ctime())

checkbox元素操作

在实际项目过程中,会经常遇到页面的各自复选框,那么使用selenium该如何操作这些选项框呢?

Html页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>

<title>
</title>
</head>

<body>
<p><input type="checkbox" name="category" value="今日话题" />今日话题 </p>
<p><input type="checkbox" name="category" value="视觉焦点" />视觉焦点</p>
<p><input type="checkbox" name="category" value="财经" />财经</p>
<p><input type="checkbox" name="category" value="汽车" />汽车</p>

<p><input id="btnOperate" type="button" value="选择" onclick="static_num()" /></p>

</body>
</html>

复选框定位

tag获取页面中所有的标签为input的元素 elements 多了一个“s” 这样可以获取一组元素

1
2
3
4
5
6
7
8
9
10
inputs=driver.find_elements_by_tag_name("input")

print("复选框的个数为")
print(len(inputs))

#xpath获取元素
#inputs=driver.find_elements_by_xpath("//input[@type='checkbox']")

#通过css来定位
#inputs=driver.find_elements_by_css_selector("input[type=checkbox]")

使用for循环遍历input的元素

1
2
3
4
5
6
7
8
for i in inputs:
if i.get_attribute("type")=="checkbox": #获取元素属性为checkbox
i.click() #勾选方框
time.sleep(1)

#去掉最后一个选修的勾
driver.find_elements_by_xpath("//input[@type='checkbox']").pop(-1).click()
#pop(-1)获取最后一个,pop(0)获取第一个

滚动条操作

selenium可以模拟人工上下滑动进度条的操作。

实践案例

案例1:

打开我要自学网页面,然后将滚动条拖到最底部,然后再拖到顶部

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from  selenium import webdriver
from time import sleep

driver=webdriver.Firefox()
driver.get("http://www.51zxw.net/")
sleep(2)

#将滚动调拖到最底部
js="var action=document.documentElement.scrollTop=10000"
driver.execute_script(js)
sleep(2)

#将滚动条拖到最顶部
js="var action=document.documentElement.scrollTop=0"
driver.execute_script(js)
sleep(3)

driver.quit()

案例2:

分别打开我要自学网页面和百度页面,然后进行截图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from selenium import webdriver
from time import sleep

#加载浏览器驱动
driver=webdriver.Firefox()

#打开自学网页面并截图
driver.get("http://www.51zxw.net")
driver.get_screenshot_as_file(r"E:\Python_script\51zxw.jpg")

#打开百度页面并截图
driver.get("http://www.baidu.com")
driver.get_screenshot_as_file(r"E:\Python_script\baidu.png")


sleep(2)
driver.quit()