利用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模块控制浏览器的更多相关文章

  1. 用selenium 模块控制浏览器

    11.8 用selenium 模块控制浏览器selenium 模块让Python 直接控制浏览器,实际点击链接,填写登录信息,几乎就像是有一个人类用户在与页面交互.与Requests 和Beautif ...

  2. python selenium模块调用浏览器的时候出错

    python selenium模块使用出错,这个怎么改 因为不同版本更新不同步问题,浏览器都要另外下一个驱动.

  3. 爬虫(五)—— selenium模块启动浏览器自动化测试

    目录 selenium模块 一.selenium介绍 二.环境搭建 三.使用selenium模块 1.使用chrome并设置为无GUI模式 2.使用chrome有GUI模式 3.查找元素 4.获取标签 ...

  4. Python+Selenium学习--控制浏览器控制条

    场景 有时候web 页面上的元素并非直接可见的,就算把浏览器最大化,我们依然需要拖动滚动条才能看到想要操作的元素,这个时候就要控制页面滚动条的拖动,但滚动条并非页面上的元素,可以借助JavaScrip ...

  5. selenium webdriver——控制浏览器

    from selenium import webdriver import time def controlBrowser(): #启动浏览器 driver = webdriver.Firefox() ...

  6. 爬虫之selenium模块;无头浏览器的使用

    一,案例 爬取站长素材中的图片:http://sc.chinaz.com/tupian/gudianmeinvtupian.html import requests from lxml import ...

  7. python Web抓取(二)selenium模块的使用、对浏览器的按键操作及错误处理

    建议以下帖子: 教你在Windows上搭建Python+Selenium环境:https://blog.csdn.net/huilan_same/article/details/52888262 py ...

  8. python-web-selenium模拟控制浏览器

    用 selenium 模块控制浏览器 启动 selenium 控制的浏览器 from selenium import webdriver brower = webdriver.Firefox() br ...

  9. 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求

    第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...

随机推荐

  1. SharePoint管理中心配置内容数据库

    SharePoint管理中心配置内容数据库         在SharePoint2010中,内容数据库是组织数据的核心. 是全部站点内容信息,如文档.列表数据和Web部件属性等存储的地方.默认地,内 ...

  2. tomcat遇到版本问题

    1.Dynamic web module 2.J2EE  Web modules 3.Tomcat version 4.<web-app xmlns:xsi="http://www.w ...

  3. flask/sqlalchemy - OperationalError: (sqlite3.OperationalError) no such table

    狗书第五章 记得要先创建表 执行 db.create_all()语句来创建表 https://segmentfault.com/q/1010000005794140

  4. python dict转json并保存文件

    import json f = open("index.html", "wb") json.dump(response.data, f) f.close() d ...

  5. js 把字符串当做方法执行

    <SCRIPT LANGUAGE="JavaScript"> function test(str){ alert(str); } eval('test("aa ...

  6. HDU2844 Coins 多重背包

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. Android开发:《Gradle Recipes for Android》阅读笔记1.5

    这节讲的是如何如何添加JAVA依赖库. 默认的android项目有两个build.gradle文件,分别位于顶级目录,和应用自己的目录下(通常放在一个叫app的目录下面). gradle支持多种方式列 ...

  8. PHP中mysql_fetch_row()、mysql_fetch_assoc()和mysql_fetch_array()的联系

    总是记不住或者混淆mysql_fetch_row().mysql_fetch_assoc()和mysql_fetch_array()这三个函数的朋友们注意了,今天我在这里给大家总结一下他们之间的关系, ...

  9. Bootstrap(Web前端CSS框架)

    官方定义: Bootstrap is the most popular HTML, CSS, and JS framework for developing responsive, mobile fi ...

  10. jquery 模糊查询对象属性

    1.如果你需要查询的对象属性id的值包含这样的值,你可以这样读取所有此条件的对象 $("input[id*='DiscountType']").each(function (i, ...