快速掌握使用Selenium进行网页操作

这是《快速掌握Selenium Web自动化》的第4篇

(文中长的代码块已经可以左右拖动了,效果如何欢迎留言反馈)

在上一篇中,我们介绍了如何使用Selenium在页面中查找定位页面元素。在定位到页面元素之后,我们能够做些什么呢?本篇我们就将来简单了解一下。

4.1 模拟键盘键入

4.1.1 输入文本

在定位到元素之后,我们一般会做什么?如果定位的是input输入框,那么我们可能需要在其中输入一些值。想要实现这个功能,在Selenium中,我们可以使用sendkeys()方法,在上一篇文章定位input元素的示例中,我们稍微演示了一下sendkeys()的使用:

# coding:utf-8
'''
    @author:州的先生
    @site:zmister.com
    @微信公众号:州的先生
'''
from selenium import webdriver

driver = webdriver.Chrome(executable_path=r"D:\chromedriver_win32\chromedriver.exe")
driver.get('http://www.baidu.com')
ele = driver.find_element_by_id('kw')
ele.send_keys("州的先生")

这样,selenium就会操纵浏览器在input输入框内输入“州的先生”这4个字:

4.2.1 清除文本

如果,输入错了,嗯,没关系,我们可以使用clear()方法,对元素的值进行清除:

# coding:utf-8
'''
    @author:州的先生
    @site:zmister.com
    @微信公众号:州的先生
'''
from selenium import webdriver

driver = webdriver.Chrome(executable_path=r"D:\chromedriver_win32\chromedriver.exe")
driver.get('http://www.baidu.com')
ele = driver.find_element_by_id('kw')
ele.send_keys("州的先生")
ele.clear()

4.1.3 实现点击

在input输入框输入了内容之后,我们可能需要点击“百度一下”按钮进行搜索。这时候,我们可以定位到按钮元素,再对按钮元素执行click()方法进行点击:

# coding:utf-8
'''
    @author:州的先生
    @site:zmister.com
    @微信公众号:州的先生
'''
from selenium import webdriver

driver = webdriver.Chrome(executable_path=r"D:\chromedriver_win32\chromedriver.exe")
driver.get('http://www.baidu.com')
ele = driver.find_element_by_id('kw')
ele.send_keys("州的先生")
search = driver.find_element_by_id('su')
search.click()

这样就完成了从输入搜索词,到点击搜索的过程。除此之外,还有另外一种方法。

4.1.4 键盘功能键的键入

另外一种方法就是,可以在输入input输入框的值之后,直接模拟回车键(因为百度提供了回车直接搜索的功能)。

要模拟键入键盘上的回车,我们首先需要导入直接相关的模块:

from selenium.webdriver.common.keys import Keys

这个Keys中,包含了键盘的各种功能键的定义:

我们可以直接在send_keys()方法中使用:

# coding:utf-8
'''
    @author:州的先生
    @site:zmister.com
    @微信公众号:州的先生
'''
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(executable_path=r"D:\chromedriver_win32\chromedriver.exe")
driver.get('http://www.baidu.com')
ele = driver.find_element_by_id('kw')
ele.send_keys("州的先生",Keys.ENTER)
# search = driver.find_element_by_id('su')
# search.click()

这样,我们不用定位按钮元素,也能够成功执行搜索:

其他键的使用方法也是一样的。

4.2 模拟鼠标行为

除了在输入框中输入文本,我们可能还经常需要在网页上使用鼠标进行一些拖动操作,比如把一个元素拖动到另一个元素里面,把一个元素拖动到另一个位置上。

在selenium中,有一个专门用于鼠标行为的类名为ActionChains:

from selenium.webdriver import ActionChains

其中定义了很多的鼠标动作操作方法,比如:

  • click:鼠标左键点击;
  • clickandhold:在元素上按住鼠标左键;
  • context_click:在元素上执行鼠标右击;
  • double_click:在元素上执行鼠标双击;
  • draganddrop:拖拽一个元素到另一个元素上;
  • draganddropbyoffset:拖拽一个元素到另一个偏移量上;
  • movebyoffset:移动鼠标指定的偏移量;
  • movetoelement:将鼠标移动到某个元素上;
  • movetoelementwithoffset:通过指定元素的偏移量移动鼠标;
  • release :释放一个元素上的鼠标按钮;
  • perform : 执行定义的所有鼠标动作;

我们可以通过ActionChains类下面的方法进行丰富的鼠标操作。

先来看一个例子: http://sahitest.com/demo/dragDropMooTools.htm

是一个自动化测试的demo,里面包含了一个可拖拽对象,我们可以通过它来测试Selenium的鼠标拖拽事件:

查看一下需要拖拽的元素的结构:

目的元素的结构:

接下来,我们使用Selenium的鼠标拖拽方法draganddrop()演示拖拽:

# coding:utf-8
'''
    @author:州的先生
    @site:zmister.com
    @微信公众号:州的先生
'''
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Chrome(executable_path=r"D:\chromedriver_win32\chromedriver.exe")
driver.get('http://www.zhualv.com/demo/dragDropMooTools.htm')
# 被拖拽元素
dragger = driver.find_element_by_id('dragger')  
 # 目标元素
item1 = driver.find_element_by_xpath('//div[text()="Item 1"]') 
time.sleep(3)
action = ActionChains(driver)
# 移动dragger到目标1
action.drag_and_drop(dragger, item1).perform()

这样就实现了使用Selenium在网页上进行鼠标的拖拽。

4.3 切换窗口与框架

在实际的应用中,我们可能会在浏览器中打开多个窗口,或者一些网页中存在子框架(比如一些登录框)。我们需要对其进行操作,就必须首先切换到相应的窗口或者子框架中。

在Selenium中,我们通过其提供的switch_to方法来进行切换操作。

通过上图我们可以发现,switch_to不仅支持切换窗口和子框架,还能够切换到一个活动的元素、父框架以及弹出alert框。下面我们看看其的具体使用方法。

4.3.1 切换窗口

如果我们使用Selenium打开了多个窗口,使用switch_to.window()方法可以很方便地对窗口进行切换。我们来看一个实际的例子,我们在搜狗的微信搜索中搜索“州的先生”,然后点击第一个搜索结果:

# coding:utf-8
'''
    @author:州的先生
    @site:zmister.com
    @微信公众号:州的先生
'''
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path=r"D:\chromedriver_win32\chromedriver.exe")

driver.get('http://weixin.sogou.com/')
inputs = driver.find_element_by_id('query')
inputs.clear()
inputs.send_keys("州的先生")
submit = driver.find_element_by_css_selector("input.swz")
submit.click()
time.sleep(3)
article = driver.find_element_by_css_selector("div.txt-box > h3 > a")
article.click()

其会新打开一个窗口显示搜索的文章内容,如下动图所示:

如何将当前的窗口切换回之前的搜索结果页呢?看看switch_to.window()的方法:

# coding:utf-8
'''
    @author:州的先生
    @site:zmister.com
    @微信公众号:州的先生
'''
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path=r"D:\chromedriver_win32\chromedriver.exe")

driver.get('http://weixin.sogou.com/')
inputs = driver.find_element_by_id('query')
inputs.clear()
inputs.send_keys("州的先生")
submit = driver.find_element_by_css_selector("input.swz")
submit.click()
time.sleep(3)
# 获取第一个窗口
window_1 = driver.current_window_handle
# 定位第一个搜索结果并新窗口打开
article = driver.find_element_by_css_selector("div.txt-box > h3 > a")
article.click()
time.sleep(5)
# 切换回第一个窗口
driver.switch_to.window(window_1)

运行程序,结果如下动图所示:

切换子框架的步骤和方法与此类似,在此就不演示了。

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2018-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏禅林阆苑

Sublime快捷键与常用插件配置总结 【原创】

Sublime快捷键与常用插件配置总结 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: git...

3518
来自专栏web开发

移动端图片放大滑动查看-插件photoswipe的使用

最近在开发项目的时候,遇到一个需求,需要移动端实现放大查看图片的功能,然后我就在网上搜索了一下资料,看到了photoswipe这个插件,后来试了试,确实挺好用的...

2805
来自专栏飞雪无情的博客

java.lang.UnsupportedOperationException android.view.GLES20Canvas.clipPath

今天自定义控件使用Canvas绘图的时候遇到的这个错误,看错误的描述,是不支持这个clipPath方法的。而且在2.3的机器上没有问题,是一部4.0的机器报了这...

693
来自专栏互联网杂技

Chrome 35个开发者工具的小技巧【动态图演示】

谷歌浏览器如今是Web开发者们所使用的最流行的网页浏览器。伴随每六个星期一次的发布周期和不断扩大的强大的开发功能,Chrome变成了一个必须的工具。大多数可能熟...

2744
来自专栏青青天空树

认识基本的mfc控件

  几乎可以在每个windows程序中都看到按钮、复选框、文本框以及下拉列表等等,这些都是控件。而且很多常用的控件已经内置到操作系统当中了,在Visual C+...

612
来自专栏React Native开发圈

React Native 弹出框组件

npm install--save react-native-popup-dialog

691
来自专栏React Native开发圈

React Native 图片查看组件

npm i react-native-image-zoom-viewer--save

712
来自专栏令仔很忙

新手学JavaScript(三)----超酷消息警告框插件(SweetAlert)

今天给大家推荐一款不错的超酷消息警告框–SweetAlert;SweetAlert是一款不需要jQuery支持的原生js提示框,风格类似bootstrap。它...

862
来自专栏州的先生

Python GUI教程(九):从UI文件中解耦Python代码

1435
来自专栏IT 指南者专栏

前端系列之HTML基础知识概述

1、什么是HTML HTML:Hyper Text Markup Language 超文本标记语言。 超文本:功能比普通文本更加强大。 标记语言:使用一组标签...

2709

扫码关注云+社区