python3使用selenium上篇

selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
想了解selenium发展史点击一下。

实例百度搜索selenium

# 导入webdriver类
from selenium import Webdriver
# 调用selenium浏览器驱动,获取浏览器句柄
driver = webdriver.Firefox()
# 通过句柄访问URL
first_url = 'http://www.baidu.com'
driver.get(first_url)
# 通过句柄控制页面元素
driver.find_element_by_id("kw").send("selenium")  # 在搜索框输入selenium
driver.find_element_by_id("su").click()  # 单击百度一下

环境搭建

1.安装python3
python下载地址:https://www.pythin.org/
2.安装selenium
cmd命令行输入:pip install selenium

cmd命令行输入:pip install selenium=指定版本号
pip show selenium 查看当前包的版本信息
3.安装浏览器驱动(WebDriver)
驱动下载地址:http://www.seleniumhq.org/download/
解压文件,将得到的.exe文件放到python目录下

元素定位

1. id定位
通过HTML元素的ID值定位:
find_element_by_id("id名称")
2. name定位
通过HTML元素的name属性值定位:
find_element_by_name("name名称")
3. class定位
通过HTML元素的class值定位:
find_ement_by_class_name("class名称")
4. tag定位
每个一个元素本质上也是一个tag,如:<div>、<input>、<a>等
find_element_by_tag_name("input")
5. link定位
它专门用来定位文本链接:
find_element_by_link_text("链接名")
6. partial link定位
parial link定位是对link定位的一种补充,有些文本链接会比较长,这个时候我们可以取文本链接的一部分定位,只要这一部分信息可以唯一地标识这个链接。
find_element_by_partial_link_text("一个很长的文本链接")
7. XPath定位

  • 绝对路径定位
    find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
    div[2]表示当前层级下的第二个div标签
  • 元素属性定位
    find_element_by_xpath("//input[@id='id名称']")
    find_element_by_xpath("//input[@name='name名称']")
    find_element_by_xpath("//input[@class='class名称']")
    find_element_by_xpath("//*[@id='id名称']")
    find_element_by_xpath("//input[@type='submit']")
    find_element_by_xpath('//p[contains(text(), "问卷")]/a')
    说明://表示当前页面某个目录下, input表示定位元素的标签名,[@id="id名称"]表示这个元素的id属性值,如果不想指定标签名,则可以用星号(*)代替,元素的任意属性值都可以使用,只要它能唯一的标识一个元素。
  • 层级与属性结合
    如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以找其上一级元素,或上上级元素。
    find_element_by_xpath("//span[@class='class名称']/span/input")
  • 使用逻辑运算符
    如果一个属性不能唯一区分一个元素,我们还可以使用逻辑运算符连接多个属性来查找元素
    find_element_by_xpath("//input[@id='值' and @class='值']/span/input")
  • 通过开发这工具(F12)定位元素复制xpath绝对路径

8. 常用css定位

选择器 例子 描述
.class .temp class选择器,选择class="temp"的所有元素
#id #kw id选择器,选择id="kw"的所有元素
* * 选择所有元素
element input 选择所有<input>元素
> div>input 选择父元素为<div>的所有<input>元素,父子关系
+ div+input 选择同一级紧接在<div>元素之后的所有<input>元素 ,兄弟关系
[attrbute=value] [type="submit"] 选择type="submit"的所有元素

9. 用By定位元素
针对前面介绍的8种定位方法,WebDriver还提供了另外一套写法,即统一调用find_element()方法
find_element()方法只用于定位元素,需要两个参数,第一个参数是定位的类型,第二个参数是定位的具体方式,在使用By之前需要导入By类

# 导入By
from selenium.webdriver.common.by import By
# id定位
find_element(By.ID, "id值")
# name属性定位
find_element(By.NAME, "name值")
# class属性定位
find_element(By.CLASS_NAME, "class值")
# 标签定位
find_element(By.TAG_NAME, "input")
#定位链接
find_element(By.LINK_TEXT, "新闻")
# 定位长链接
find_element(By.PARTIAL_LINK_TEXT, "新")
# xpath定位
find_element(By.XPATH, "//*[@class='值']")
# css定位
find_element(By.CSS_SELECTOR, "span.class值>input#值")

10. 定位一组元素
定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多加了个s表示复数。
用于场景:批量操作元素。
例如,勾选页面上所有的复选框,先获取一组元素,再从这组对象中过滤出需要操作的元素。

# 选择页面上所有的tag_name为input的元素
inputs=driver.find_elements_by_tag_name('input')
# 然后从中过滤出type为checkbox的元素,单击勾选
fro input in inputs:
    if input.get_attribute('type')== 'chexkbox':
        input.click()

操作页面的方法

1. 简单的元素操作

  • back() 后退
  • forward() 前进
  • refresh()刷新(F5)
  • set_window_size(480*800) 设置浏览器窗口大小
  • maximize_window() 全屏显示
  • clear() 清除文本
  • send_keys("值") 模拟按键输入
  • click() 单击元素
  • submit() 用于提交表单,相当于“回车”键的操作
  • quit() 关闭所有窗口
  • close() 关闭当前窗口

2. 获取页面信息

  • size 返回元素的尺寸
  • text 获取元素的文本内容
  • get_attribute(name) 获取属性值
  • is_displayed 判断元素是否可见 (True可见,False不可见)
  • title 获取当前页面的标题
  • current_url 获得当前页面的URL

3. 鼠标事件

  • perform() 执行所有ActionChains中存储的行为,可以理解成是对整个操作的提交动作。

  • context_click() 右击

  • double_click() 双击

  • drag_and_drop 拖动

  • move_to_element() 鼠标悬停

  • release() 在某个元素位置松开鼠标左键

  • move_by_offset(xoffset, yoffset) 鼠标从当前位置移动到某个坐标

  • move_to_element(to_element) 鼠标移动到某个元素

  • move_to_element_with_offset(to_element, xoffset, yoffset) 移动到距某个元素(左上角坐标)多少距离的位置

实例模拟右击

# 导入提供鼠标操作的ActionChains类    
from selenium webdriver import ActionChains
# 定位要右击的元素
youji=driver.find_element_by_id("xx")
# 调用ActionChains()类,将浏览器驱动driver作为参数传入
# context_click()方法用于模拟鼠标右击操作
ActionChains(driver).context_click(youji).perform()

4. 键盘事件

  • send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

  • send_keys(Keys.SPACE) 空格键(Space)

  • send_keys(Keys.TAB) 制表键(Tab)

  • send_keys(keys.ESCAPE) 回退键(Esc)

  • send_keys(Keys.ENTER) 回车键(Enter)

  • send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)

  • send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)

  • send_keys(Keys.F1) 键盘F1

  • key_down(value, element=None) 按下某个键盘上的键

  • key_up(value, element=None) 松开某个键

元素定位调试

  • 通过$()调试定位

  • 通过$x()调试xpath定位


    调试定位
  • print(driver.page_source) 打印元素内容,用于调试用

接下篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350