selenium模块控制浏览器
利用selenium模块控制浏览器
导入selenium模块:from selenium import webdriver
browserFirefox = webdriver.Firefox()#打开Firefox浏览器,返回一个Webdriver对象
browserFirefox.get('http://www.baidu.com')
Webdriver对象有两种方法:
find_element_*和find_elements_*方法
1、find_element_*:返回一个WebElement对象,代表页面中的匹配查询到的第一个元素
2、find_elements_*:返回的是WebElement_*对象的列表,包含页面中所有匹配的元素
元素定位:
find_element_by_id() //根据id属性定位
find_element_by_name() //根据name属性定位
find_element_by_class_name() //根据class属性定位
find_element_by_link_text() //根据文字链接
find_element_by_partial_link_text() //根据文字链接的一部分
find_element_by_tag_name() //根据标签名称
find_element_by_xpath() //根据xpath定位,xpath如何用多个属性定位, find_element_by_xpath("//div[@class='x' and name='b']")
绝对路径写法(只有一种),写法如下:
引用页面上的form元素(即源码中的第3行):/html/body/form[1]
注意:1. 元素的xpath绝对路径可通过firebug直接查询。2. 一般不推荐使用绝对路径的写法,因为一旦页面结构发生变化,该路径也随之失效,必须重新写。3.
绝对路径以单/号表示,而下面要讲的相对路径则以//表示,这个区别非常重要。另外需要多说一句的是,当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析。当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。而当/出现在xpath路径中时,则表示寻找父节点的直接子节点,当//出现在xpath路径中时,表示寻找父节点下任意符合条件的子节点,不管嵌套了多少层级(这些下面都有例子,大家可以参照来试验)。弄清这个原则,就可以理解其实xpath的路径可以绝对路径和相对路径混合在一起来进行表示,想怎么玩就怎么玩。
下面是相对路径的引用写法:
查找页面根元素://
查找页面上所有的input元素://input
查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input
查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input
查找页面上第一个form元素://form[1]
查找页面上id为loginForm的form元素://form[@id='loginForm']
查找页面上具有name属性为username的input元素://input[@name='username']
查找页面上id为loginForm的form元素下的第一个input元素://form[@id='loginForm']/input[1]
查找页面具有name属性为contiune并且type属性为button的input元素://input[@name='continue'][@type='button']
查找页面上id为loginForm的form元素下第4个input元素://form[@id='loginForm']/input[4]
find_element_by_css_selector() //根据css选择器定位
find_element_by_xpath()和find_element_by_css_selector()可以直接在chrome中的检查中copy
除了*_by_tag_name() 方法,所有的方法的参数都是区分大小的,
如果页面上没有元素匹配该方法要查找的元素,selenium模块就会抛出NoSuchElement异常,如果不希望程序崩溃,就在代码中加入try和except语句
WebElement对象的属性和方法:
tag_name //标签名,例如'a'表示<a>元素
get_attribute(name) // 该元素name的属性值
text //该元素内的文本,例如<span>hello</span>中的'hello'
clear() //对于文本字段或文本区域元素,清除其中输入的文本
is_displayed() //如果该元素可见,返回True,否则返回False
is_enabled() //对于输入元素,如果该元素启用,返回True,否则返回False
is_selected() //对于复选框或单选框元素,如果该元素被选中,返回True,否则返回False
location //一个字典,包含键'x'和'y',表示该元素在页面上的位置
打开网页需要添加等待时间让网页加载完成:
time.sleep(3) #休眠3秒
implicitly_wait() #智能等待
对浏览器的操作:
最大化:driver.maximize_window()
设置宽和高:driver.set_window_size(width,height)
浏览器的前进和后退:
前进:driver.forward()
后退:driver.back()
刷新:driver.refresh()
关闭窗口:driver.quit()
操作对象:
click() 点击对象
send_keys() 模拟按键输入
clear() 清除对象内容
submit() 如果有submit按钮,自动提交表单
text 获取文本信息
get_attribute() 获取属性值
键盘操作:(引入keys包)
from selenium.webdriver.common.keys import Keys
Keys.DOWN,Keys.UP,Keys.LEFT,Keys.RIGHT----键盘箭头键
Keys.ENTER,Keys.RETURE----回车和换行键
Keys.HOME,Keys.END,Keys.PAGE_DOWN,Keys.PAGE_UP----Home键、END键、Page_down键和Page_up键
Keys.ESCAPE,Keys.BACK_SPACE,Keys.DELETE----Esc,Backspace和Delete键
Keys.F1,Keys.F2,......Keys.F3----键盘顶部F1-F12键
Keys.TAB----Tab键
driver.find_element_by_id("xx").send_keys(Keys.ENTER) (输入回车)
Keys.TAB #换行
组合键:
send_keys(Keys.CONTROL,'a') #ctrl+a
鼠标操作:导入ActionChains包
from selenium.webdriver.common.action_chains import ActionChains
dr.find_element_by_id("xx").context_click() #右击
double_click() #双击
drag_and_drop(a,b) #将a拖动到b位置
定位一组元素:将元素定位中的element换成elements,返回的是列表
多层框架/窗口
switch_to_frame("frame_name")#可以传入id、name、index以及selenium的WebElement对象,直接切换
如果只有class时,只能先找到再切换:
frame = driver.find_element_by_class_name("APP-editor-iframe") #若iframe有id或是name属性,可以直接切换
driver.switch_to_frame(frame)
switch_to_window("window_name")
例子:
#获取hao123主页的句柄
handle_hao123 = driver.current_window_handle,然后传入参数
#获取所有窗口的句柄
all_handles = driver.window_handles
#根据窗口句柄的再判断,切换到163窗口
for handle in all_handles:
if handle != handle_hao123:
driver.switch_to.window(handle)
上传文件:driver.find_element_by_id("xx").send_keys(文件路径名,绝对相对都可以)
对话框
text 返回alert/confirm/prompt 中的文字信息
accept 点击确认按钮
dismiss 点击取消按钮,如果有的话
send_keys 输入值,这个alert\confirm 没有对话框就不能用了,不然会报错。
调用js:execute_script(script,*args) #在当前窗口执行js脚本
cookie处理:
driver.get_cookies() 获得cookie 信息
add_cookie(cookie_dict) 向cookie 添加会话信息
delete_cookie(name) 删除特定(部分)的cookie
delete_all_cookies() 删除所有cookie
selenium模块控制浏览器的更多相关文章
- 用selenium 模块控制浏览器
11.8 用selenium 模块控制浏览器selenium 模块让Python 直接控制浏览器,实际点击链接,填写登录信息,几乎就像是有一个人类用户在与页面交互.与Requests 和Beautif ...
- python selenium模块调用浏览器的时候出错
python selenium模块使用出错,这个怎么改 因为不同版本更新不同步问题,浏览器都要另外下一个驱动.
- 爬虫(五)—— selenium模块启动浏览器自动化测试
目录 selenium模块 一.selenium介绍 二.环境搭建 三.使用selenium模块 1.使用chrome并设置为无GUI模式 2.使用chrome有GUI模式 3.查找元素 4.获取标签 ...
- Python+Selenium学习--控制浏览器控制条
场景 有时候web 页面上的元素并非直接可见的,就算把浏览器最大化,我们依然需要拖动滚动条才能看到想要操作的元素,这个时候就要控制页面滚动条的拖动,但滚动条并非页面上的元素,可以借助JavaScrip ...
- selenium webdriver——控制浏览器
from selenium import webdriver import time def controlBrowser(): #启动浏览器 driver = webdriver.Firefox() ...
- 爬虫之selenium模块;无头浏览器的使用
一,案例 爬取站长素材中的图片:http://sc.chinaz.com/tupian/gudianmeinvtupian.html import requests from lxml import ...
- python Web抓取(二)selenium模块的使用、对浏览器的按键操作及错误处理
建议以下帖子: 教你在Windows上搭建Python+Selenium环境:https://blog.csdn.net/huilan_same/article/details/52888262 py ...
- python-web-selenium模拟控制浏览器
用 selenium 模块控制浏览器 启动 selenium 控制的浏览器 from selenium import webdriver brower = webdriver.Firefox() br ...
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...
随机推荐
- Git merge two repositories (ZZ)
转自 https://stackoverflow.com/questions/2428137/how-to-rebase-one-git-repository-onto-another-one If ...
- PHP基础之Autoload
PHP的自动加载autoload机制很重要,这里做2个小练习 原创文章,转载请注明:http://www.cnblogs.com/phpgcs 文件结构如下,2种方式实现自动加载 1,自定义函数 2, ...
- Trailing Zeroes (III) 假设n!后面有x个0.现在要求的是,给定x,要求最小的n; 判断一个n!后面有多少个0,通过n/5+n/25+n/125+...
/** 题目:Trailing Zeroes (III) 链接:https://vjudge.net/contest/154246#problem/N 题意:假设n!后面有x个0.现在要求的是,给定x ...
- 【翻译自mos文章】在Oracle GoldenGate中循环使用ggserr.log的方法
在OGG中循环使用ggserr.log的方法: 參考原文: OGG How Do I Recycle The "ggserr.log" File? (Doc ID 967932.1 ...
- php zend studio 如何导入已经存在的项目
点击 左上的 file->import ->General->在选择第二个[ Exissting ....]
- Hibernate使用xml文件的每个类层次一张表
通过这种继承策略,我们可以通过单表映射整个层次结构. 这里,在表中创建一个额外的列(也称为discriminator列)来标识该类. 让我们先了解问题.下面给出的整个层次类映射到数据库的一个表中图解说 ...
- 【直播预告】7月18日3D游戏引擎免费公开课答疑,參与送C币!
喜讯喜讯! 为了酬谢广大学员.CSDN学院特推出iOS和3D游戏引擎开发免费技术答疑公开课,让您度过一个充实的暑假~ 參与本次公开课,即有机会获得50C币! 答疑公开课时间:7月18日 晚7:30-9 ...
- weex - 创建项目
初始化 请确保你已经安装了 Node.js,然后全局安装 weex-toolkit. npm install weex-toolkit -g 这条命令会向你命令行环境中注册一个 weex 命令.你可以 ...
- windows 32位以及64位的inline hook
Tips : 这篇文章的主题是x86及x64 windows系统下的inline hook实现部分. 32位inline hook 对于系统API的hook,windows 系统为了达成hotpatc ...
- Android开发:《Gradle Recipes for Android》阅读笔记1.1
第一章1.1节 注:下面都是用android studio新建出来的默认项目配置,没有修改 1.settings.gradle记录了哪些子目录包含了它们自己的工程,例如:include':app',如 ...