一、搭建Selenium环境
1.1 Selenium是什么?
Selenium是一个Web自动化测试软件。
1.2 在Python中安装Selenium
pip install selenium
1.3 下载浏览器驱动程序
Selenium 需要通过浏览器的驱动程序(webdriver)连接并启动浏览器。如果你使用 Firefox,你需要 geckodriver;如果你使用 Chrome,你需要 chromedriver;
这里我们选择谷歌的Chrome浏览器作为demo,所以需要下载chromedriver。
网址:http://npm.taobao.org/mirrors/chromedriver/
选择版本-->选择平台-->下载解压-->得到“chromedriver.exe“
1.4 总结
本章简要介绍了 Selenium,在 Python 中安装 Selenium,并下载了相应的浏览器驱动程序。
二、Selenium操纵浏览器的最基本用例
2.1 简单的使用Selenium
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
inputs.clear()
inputs.send_keys("汪继超 数据结构")
''' 运行以上代码,电脑会自动启动Chrome浏览器并打开百度主页,
找到百度的输入框,在里面输入“王继超数据结构”'''
2.2 用例代码解释
从 selenium 导入和 webdriver 子模块,webdriver 提供所有浏览器驱动实现调用方法:
from selenium import webdriver
实例化一个Chrome浏览器的webdriver {在Chrome()方法中,我们通过executable_path指定之前下载的chromedriver.exe的路径。 }:
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
驱动程序的 get() 方法将操纵浏览器打开指定的 URL。此步骤将等待页面完全加载:
driver.get("http://www.baidu.com")
等待页面加载后,我们使用 find_element_by_id() 方法通过其 ID 定位和查找页面输入元素。在 selenium 中,webdriver 提供了很多查找元素的方法,它们的方法名称为 find_element_by_*:
inputs = driver.find_element_by_id('kw')
通过输入框的id值定位到百度首页上的输入搜索框后,我们再使用clear()方法清除输入框的内容(虽然输入框中没有内容),然后使用send_keys() 方法把一个字符串发送到输入框:
inputs.clear()
inputs.send_keys("汪继超 数据结构")
2.3 总结
在本章中,我们通过一个简单的例子完成了对 Selenium 的初步介绍——操纵 Chrome 浏览器打开百度主页,在输入框中输入搜索词。 Selenium 的用途还有很多,我们将在接下来的章节中一一介绍。
三、在Selenium中定位查找网页元素的诸类方法
要使用 Selenium 自动化操作,首先要做的是通过 webdriver 的 get() 方法打开一个 URL 链接。打开链接并完成页面加载后,就可以通过 Selenium 提供的接口对页面进行各种操作。让我们看看如何找到元素。
3.1 查找和定位网页元素
在上一章的示例中,我们演示了如何使用 find_element_by_id() 方法根据其 id 值定位页面元素。除了根据 id 值查找元素外,Selenium 还提供了许多查找元素的方法。 Selenium 提供了近二十个 find_element 系列方法供我们在页面中查找元素,包括 id、name、类名、css 选择器、链接文本、标签名、xpath 等。
定位单个匹配元素的方法有:
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
我们可以根据不同页面的不同情况来查找定位到我们所需要的页面元素。
3.2 通过id属性进行定位
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
3.3 通过name属性进行定位
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_name('wd')
3.4 通过Xpath进行元素定位
XPath 是一种用于在 XML 文档中查找节点的语言。关于Xpath的知识,这里就不介绍了。有需要的同学可以看看Xpath专用的网站或者教程,例如:W3school Xpath tutorial。
这里简单介绍一下如何通过浏览器快速获取页面元素的Xpath路径。在浏览器中打开网页调试控制台,右键单击要定位的元素,会出现一个选项栏,在“复制”中选择“复制XPath”:
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_xpath('//*[@id="kw"]')
3.5 通过标签名来定位元素
当我们想通过标签名称定位元素时,可以使用 find_element_by_tag_name() 方法,该方法将返回具有给定标签名称的第一个元素:
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_tag_name('input')
3.6 通过class类名来定位元素
如果我们想通过元素的类属性的值来定位,我们可以使用 find_element_by_class_name() 方法。它将返回第一个匹配的元素,如果没有匹配的元素,它也会抛出 NoSuchElementException:
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_class_name('s_btn')
3.7 通过CSS选择器进行定位元素
CSS 选择器是一种通过 CSS 属性值定位元素的语法。我们可以使用 find_element_by_css_selector() 方法通过 css 选择器来定位元素:
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_css_selector('input.s_btn')
3.8 通过链接标签文字定位元素
除了上面的元素定位方法外,我们还可以通过a标签上的文字来定位元素,使用find_element_by_link_text()方法,如果我们需要定位“视频”链接元素,可以这样做:
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_link_text('视频')
3.9 总结
在本章中,我们介绍了在使用 Selenium 打开页面后,如何通过 id 属性、name 属性、class 属性、Xpath 路径、CSS 选择器、标签名称等来查找和定位元素。页面元素的成功定位是对页面进行复杂操作的重要前提。
四、使用Selenium在网页上进行操作
在上一章中,我们介绍了如何使用 Selenium 在页面中查找和定位页面元素。定位到页面元素后,我们可以做什么?在本章中,我们将在未来对其进行简要介绍。
4.1 模拟键盘键入
4.1.1 输入文本
定位到元素后我们一般会做什么?如果针对输入输入框,那么我们可能需要在里面输入一些值。为了实现这个功能,在 Selenium 中,我们可以使用 send_keys() 方法。在上一章定位输入元素的例子中,我们稍微演示一下 send_keys() 的使用:
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
inputs.send_keys("汪继超 数据结构")
这样selenium就会操纵浏览器在输入框输入“王继超数据结构”
4.1.2 清除文本
如果输入错误,好吧,没关系,我们可以使用 clear() 方法清除元素的值:
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
inputs.send_keys("汪继超 数据结构")
inputs.clear()
4.1.3 实现点击
在输入框中输入内容后,我们可能需要点击“百度”按钮进行搜索。这时候我们可以定位到button元素,然后在button元素上执行click()方法进行点击:
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
inputs.send_keys("汪继超 数据结构")
search_btn = driver.find_element_by_id('su')
search_btn.click()
这样就完成了从输入搜索词到点击搜索的过程。此外,还有另一种方式。
4.1.4 键盘功能键的键入
另一种方法是在输入框的值输入后直接模拟回车键(因为百度提供了输入直接搜索的功能)。
为了模拟在键盘上敲回车,我们首先需要导入直接相关的模块:
from selenium.webdriver.common.keys import Keys
我们可以直接在send_keys()方法中使用:
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://www.baidu.com')
inputs = driver.find_element_by_id('kw')
inputs.send_keys("汪继超 数据结构",Keys.ENTER)
# search_btn = driver.find_element_by_id('su')
# search_btn.click()
其他键的使用方法也是一样的。
4.2 模拟鼠标行为
除了在输入框中输入文字,我们可能经常需要使用鼠标在网页上进行一些拖拽操作,比如将一个元素拖到另一个元素中,将一个元素拖到另一个位置。
在selenium中,有一个专门用于鼠标行为的类名为ActionChains:
from selenium.webdriver import ActionChains
其中定义了很多的鼠标动作操作方法,比如:
click:鼠标左键点击;
click_and_hold:在元素上按住鼠标左键;
context_click:在元素上执行鼠标右击;
double_click:在元素上执行鼠标双击;
drag_and_drop:拖拽一个元素到另一个元素上;
drag_and_drop_by_offset:拖拽一个元素到另一个偏移量上;
move_by_offset:移动鼠标指定的偏移量;
move_to_element:将鼠标移动到某个元素上;
move_to_element_with_offset:通过指定元素的偏移量移动鼠标;
release :释放一个元素上的鼠标按钮;
perform : 执行定义的所有鼠标动作;
我们可以通过ActionChains类下面的方法进行丰富的鼠标操作。
先来看一个例子:http://sahitest.com/demo/dragDropMooTools.htm
是一个自动化测试的demo,里面包含了一个可拖拽对象,我们可以通过它来测试Selenium的鼠标拖拽事件:
# coding:utf-8
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome(executable_path=r".\chromedriver.exe")
driver.get('http://sahitest.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()
4.3 切换窗口与框架
如果我们使用 Selenium 打开多个窗口,使用 switch_to.window() 方法可以轻松切换窗口。我们来看一个实际的例子,我们在搜狗的微信搜索中搜索“笑话”,然后点击第一个搜索结果。如何将当前窗口切换回上一个搜索结果页面?看一下 switch_to.window() 方法:
# coding:utf-8
import time
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r".\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)
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python解码后出现乱码是什么原因?01/14
- ♥ 如何在python中输入字符串08/21
- ♥ 如何在python中计算连续乘法?10/04
- ♥ Python如何在进程间通信12/16
- ♥ 如何卸载mongodb12/20
- ♥ python集合中的运算符是什么?如何使用?12/10
内容反馈