Selenium webdriver

下载

pip install selenium
pip install -i https://pypi.doubanio.com/simple/ selenium # 备用地址

浏览器驱动下载

还需要安装浏览器驱动,比较常见的浏览器我们一般选用Chrome和Firefox了,当然IE和Safari也有自己的驱动:
Chrome驱动地址:https://npm.taobao.org/mirrors/chromedriver,或者参见http://chromedriver.storage.googleapis.com/index.html
firefox驱动地址:https://github.com/mozilla/geckodriver/releases
IE驱动地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Safari驱动地址:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

下载与Chrome浏览器版本相对于的驱动,若没有即下载版本相近的驱动即可

测试

from selenium import webdriver
import time
driver = webdriver.Chrome() #创建Chrome WebDriver实例,此路径为驱动程序的路径
driver.get("https://www.baidu.com/") #加载URL网页
print(driver.title) #打印当前页面的title属性内容
driver.maximize_window() #页面最大化
input_obj1 = driver.find_element_by_id('kw') #找到输入框的id
input_obj1.send_keys('Na_years 博客园') #输入要搜索的内容
driver.find_element_by_id('su').click() #找到查找的按钮并click进行点击
time.sleep(2)
driver.close() #关闭当前窗口

可以看到打开一个浏览器,然后很快就关闭了,本地也打印出了结果,表示安装成功!

Webdriver常用方法

from selenium import webdriver
driver = webdriver.Chrome() #创建Chrome WebDriver实例,默认会自动查找驱动
#driver = webdriver.Firefox() #火狐
#driver = webdriver.Chrome(executable_path=r'驱动执行文件的绝对路径') #创建Chrome WebDriver实例,此路径为驱动程序的路径
driver.get("https://www.baidu.com/") #加载URL网页
print(driver.title) #打印当前页面的title属性内容
print(driver.page_source) #获取当前页面的文本内容
print(driver.name) #获取driver对象 #chrome
print(driver.current_url) #获取当前页面的url
print(driver.current_window_handle) #获取当前窗口
print(driver.window_handles) #获取所以窗口
driver.maximize_window() #页面最大化
input_obj1 = driver.find_element_by_id('kw') #找到输入框的id
input_obj = driver.find_element_by_id('kw').clear() #将输入框的内容清空
input_obj1.send_keys('Na_years 博客园') #输入要搜索的内容
driver.find_element_by_id('su').click() #找到查找的按钮并click进行点击
driver.find_element_by_xpath('//*[@id="1"]/h3/a').click() #找到查找出的第一个选项并进行click点击
# #xpath为在网页F12检查出找到对象标签进行copy的xpath
driver.execute_script('alert("xxoo")') #执行js代码
res3 = driver.save_screenshot("3.png") #直接截屏并保存
res1 = driver.get_screenshot_as_png() #获取截屏的字节流,需要自己保存
with open("1.png",'wb') as f:
f.write(res1) #将截图进行保存
driver.refresh() #刷新当前页面
driver.back() #后退上一个页面
driver.forward() #前进一个页面
driver.minimize_window() #页面最小化
driver.set_window_size(800,600) #指定页面大小
driver.close() #关闭当前窗口
driver.quit() #关闭浏览器

元素定位

要区分开find_elements还是find_element,加s是找多个

id定位

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://pythonav.com/login/')
# id定位
driver.find_element_by_id('su')
# driver.find_elements_by_id()

class定位

# class
driver.find_element_by_class_name('xxx')
driver.find_elements_by_class_name('xxx')

xpath定位

driver.find_element_by_xpath('xxx')
driver.find_elements_by_xpath('xxxx')
###实例
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://pythonav.com/login/')
driver.find_element_by_xpath('//*[@id="id_code"]').send_keys('xxxxxxxx')

css定位

driver.find_element_by_css_selector('xx')
driver.find_elements_by_css_selector('xx')
###实例:
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://pythonav.com/login/')
driver.find_element_by_css_selector('#id_username').send_keys('xxx')
input_list = driver.find_elements_by_css_selector('.form-control')
print(input_list)
input_list[1].send_keys('aaaaaa')
input_list[2].send_keys('xxxxx')
driver.find_element_by_css_selector('input[name="code"]').send_keys('xxx')
driver.find_element_by_css_selector('input[id="id_code"]').send_keys('xxx')
time.sleep(3)
driver.quit()

标签定位

driver.find_element_by_tag_name('div')
driver.find_elements_by_tag_name('div')
###实例
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.luffycity.com/home')
# 获取span的外部nav标签
nav = browser.find_element_by_tag_name(name='nav')
# 然后再获取nav内部的所有span标签
span_list = nav.find_elements_by_tag_name(name='li')
for i in span_list:
i.click()
time.sleep(3)
time.sleep(3)
browser.quit()

a标签的link属性

driver.find_element_by_link_text('xxx')
driver.find_elements_by_link_text('xxx')
driver.find_element_by_partial_link_text('xx')
driver.find_elements_by_partial_link_text('xxx')
###实例
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://pythonav.com/')
time.sleep(2)
# driver.find_element_by_link_text('免费视').click()
driver.find_element_by_partial_link_text('免费视').click()

name定位

# 根据name定位
driver.find_element_by_name('xx')
driver.find_elements_by_name('xx')
###实例
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://pythonav.com/login/')
driver.find_element_by_name('code').send_keys('xxxx')
time.sleep(3)
driver.quit()

注意及实例

​ 在选择器的选用时,要记得获取一个还是多个,要区分开find_elements还是find_element。这个s容易忽略。另外,上面的选择器,都可以写成下面的形式:

from selenium.webdriver.common.by import By  # 选择器,以什么方式选择标签元素
browser.find_element(by=By.ID, value=None) # 选择器类型, value值

​ 当获取了标签对象后,我们可以获取这个标签的属性、内容、css样式和子标签(子标签也支持这些操作),示例来自pythonav登录页

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://pythonav.com/login/')
# 根据 class 属性获取 a 标签对象
a_obj = driver.find_element_by_class_name('navbar-brand') # 获取 a 标签的href属性
print(a_obj.get_attribute('href'))
print(a_obj.text) # 获取标签的文本内容
print(a_obj.tag_name) # 获取标签的名称 # 获取 css 样式
print(a_obj.value_of_css_property('padding'))
print(a_obj.value_of_css_property('font-size'))
# 如果这个标签有 submit 属性,那么就可以点击它了,比如我们点击form表单中有submit属性的标签
driver.find_element_by_xpath('//*[@id="fm"]/div[5]/div/input').submit() # 获取该标签下的子标签,或者子标签元素
div_obj = driver.find_element_by_class_name('col-xs-3')
print(div_obj.find_element_by_tag_name('input'))
print(div_obj.find_element_by_tag_name('input').get_attribute('value')) # 获取验证码图片的大小
print(driver.find_element_by_id('image_code').size)
# # 保存验证码图片
driver.find_element_by_id('image_code').screenshot('./a.png')

EC

by

与元素定位中的结果一样,也是元素定位的另一种方法

实例

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.get('https://www.baidu.com/')
# driver.find_element_by_id('su')
driver.find_element(By.ID, 'kw').send_keys('抠脚') #找到id为kw的标签并写入值 # By.ID
# By.CLASS_NAME
# By.LINK_TEXT
# By.NAME
# By.XPATH
# By.CSS_SELECTOR

键盘模拟

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get('https://pythonav.com/login/')
# 用户名输入值
user = driver.find_element_by_id('id_username')
user.send_keys('alexdsb')
time.sleep(1)
user.send_keys(Keys.CONTROL, 'a') #模拟键盘Ctrl-a 全选
#user.send_keys(Keys.DELETE) #删除
#user.send_keys(Keys.BACKSPACE) #退格删除
user.send_keys(Keys.CONTROL, 'c') #模拟键盘Ctrl-c 复制
#密码输入
pwd = driver.find_element_by_id('id_password')
pwd.send_keys(Keys.CONTROL, 'v') #模拟键盘Ctrl-v 粘贴
time.sleep(3)
pwd.send_keys(Keys.TAB, 'ABC') #TAB之后,输入值
pwd.send_keys(Keys.ENTER) # tab之后,直接回车 time.sleep(10)
driver.quit()

鼠标模拟

方法

WebDriver中,关于鼠标相关操作的方法都封装在ActionChains类中

Method Description
click(on_element=None) 鼠标左键单击
click_and_hold(on_element=None) 鼠标左键单击,但不松开
context_click(on_element=None) 鼠标右键单击
double_click(on_element=None) 鼠标左键双击
drag_and_drop(source, target) 鼠标左键单击不松开,移动到指定元素后松开(即拖拽 )
drag_and_drop_by_offset(source, xoffset, yoffset) 鼠标左键单击不松开,移动到指定坐标后松开
move_by_offset(xoffset, yoffset) 鼠标移动到某个坐标
move_to_element(to_element) 鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) 鼠标移动到距离某个元素的某个距离
pause(seconds) 暂停输入
release(on_element=None) 在某个元素松开鼠标左键
send_keys(*keys_to_send) 在当前元素中输入值
send_keys_to_element(element, *keys_to_send) 给某个元素输入值
perform() 相应存储的动作
reset_actions() 清除所有已存储的动作

单击|双击|右击

from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
try:
driver.get('http://sahitest.com/demo/clicks.htm')
# 单击
sleep(2)
btn1 = driver.find_element_by_xpath('/html/body/form/input[3]')
ActionChains(driver).click(btn1).perform()
# 左键双击
sleep(2)
btn2 = driver.find_element_by_xpath('/html/body/form/input[2]')
ActionChains(driver).double_click(btn2).perform()
# 鼠标右键单击
sleep(2)
btn3 = driver.find_element_by_xpath('/html/body/form/input[4]')
ActionChains(driver).context_click(btn3).perform()
finally:
sleep(5)
driver.quit()

拖拽

实例1
import time
from selenium import webdriver
from selenium.webdriver import ActionChains driver = webdriver.Chrome()
driver.get('https://jqueryui.com/droppable/')
time.sleep(3)
# 因为该页面中,有iframe标签,所以先切换
frame = driver.find_element_by_tag_name('iframe')
driver.switch_to.frame(frame)
# 获取第一个元素
div1 = driver.find_element_by_id('draggable')
# 获取第二个元素
div2 = driver.find_element_by_id('droppable')
# 拖拽
ActionChains(driver).drag_and_drop(div1, div2).perform()
time.sleep(5)
driver.quit()
实例2
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
browser = webdriver.Chrome() # 获取webdriver实例
browser.get('http://www.jq22.com/demo/pintu20151229/') # 访问URL
time.sleep(1)
# 点击开始按钮,开始游戏
start = browser.find_element_by_id('start')
ActionChains(browser).move_to_element(start).click().perform()
# 准备拖动,首先要找到开始和结束的两个标签
time.sleep(2)
img1 = browser.find_element_by_xpath('//*[@id="container"]/div[18]') # 选中开始标签
img2 = browser.find_element_by_xpath('//*[@id="container"]/div[18]') # 结束标签
ActionChains(browser).move_to_element(img1).drag_and_drop(img1, img2).perform()
# 关闭浏览器
time.sleep(3)
browser.quit()

上传文件

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url='http://127.0.0.1:8000/import_case/1') #访问url
time.sleep(2)
obj = driver.find_element_by_css_selector('input[name="excel"]') #找到input框
file_path = r'C:\Users\Administrator\Desktop\接口测试示例.xlsx'
obj.send_keys(file_path) #输入文件路径
time.sleep(5)
driver.find_element_by_css_selector('.btn-success').click() #点击上次按钮
time.sleep(10)
driver.quit()

窗口切换

import time
from selenium import webdriver
driver = webdriver.Chrome()
#driver.switch_to.window() # 切换到指定的窗口对象中
#driver.switch_to.frame() # 切换到指定的iframe
#driver.switch_to.alert() # 切换到alert
#driver.switch_to.default_content() # 切换到之前的页面中
#driver.switch_to.parent_frame() # 切换到它爹的iframe
driver.get(url='https://www.baidu.com')
driver.find_element_by_id('kw').send_keys('Na_years') #搜索框输入Na_years
time.sleep(1)
driver.find_element_by_id('su').click() #点击百度
time.sleep(2)
driver.find_element_by_link_text('Na_years - 博客园').click() #点击搜索出来的选项
time.sleep(2)
handles = driver.window_handles #获取到所有窗口
time.sleep(2)
driver.switch_to.window(handles[0]) #切换到第一个窗口
time.sleep(2)
driver.switch_to.window(handles[1]) #切换到第二个窗口
time.sleep(3)
driver.quit()

webdriver中的定位\模拟\及实例的更多相关文章

  1. webdriver中定位元素,报无法找到元素的问题

    webdriver中定位元素,报无法找到元素的问题时,需要查看以下几点: 1 用火狐的firebug插件定位元素,确保这个元素的定位正确: 2 在火狐的firebug插件的,在html页签中输入fra ...

  2. Selenium的WebDriver API元素定位中的XPath和CSS

    元素的定位和操作是自动化测试的核心部分,其中操作又是建立在定位的基础上的. 浏览器的常规操作 import time from selenium import webdriver # 打开浏览器 dr ...

  3. Selenium_Selenium WebDriver 中鼠标和键盘事件分析及扩展

    在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作.在 W ...

  4. Selenium WebDriver中一些鼠标和键盘事件的使用

    转自:http://www.ithov.com/linux/133271.shtml 在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击 ...

  5. Selenium WebDriver 中鼠标和键盘事件分析及扩展(转)

    本文将总结 Selenium WebDriver 中的一些鼠标和键盘事件的使用,以及组合键的使用,并且将介绍 WebDriver 中没有实现的键盘事件(Keys 枚举中没有列举的按键)的扩展.举例说明 ...

  6. 转:总结Selenium WebDriver中一些鼠标和键盘事件的使用

    在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作.在 W ...

  7. Selenuim+Python之元素定位总结及实例说明

    网页自动化最基本的要求就是要定位到各个元素,然后才能对该元素进行各种操作(输入,点击,清除,提交等),所以笔者今天来总结下Selenuim+Python最基本的几种定位方式及实例说明,希望能帮助到大家 ...

  8. Selenium WebDriver 中鼠标和键盘事件分析及扩展[转载]

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-keyboard/ 概念 在使用 Selenium WebDriver 做自动化测试的时候,会经常模 ...

  9. 总结Selenium WebDriver中一些鼠标和键盘事件的使用

    在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作.在 W ...

随机推荐

  1. Dubbo(四):深入理解Dubbo核心模型Invoker

    一.Dubbo中Invoker介绍 为什么说Invoker是Dubbo核心模型呢? Invoker是Dubbo中的实体域,也就是真实存在的.其他模型都向它靠拢或转换成它,它也就代表一个可执行体,可向它 ...

  2. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  3. 程序员过关斩将--redis做消息队列,香吗?

    Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...

  4. Rust入坑指南:步步为营

    俗话说:"测试写得好,奖金少不了." 有经验的开发人员通常会通过单元测试来保证代码基本逻辑的正确性.如果你是一名新手开发者,并且还没体会到单元测试的好处,那么建议你先读一下我之前的 ...

  5. [redis读书笔记] 第一部分 数据结构与对象 对象类型

    - 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...

  6. Python3(九) 闭包

    一. 一切皆对象 函数式编程并没有标准定义,如果代码非常繁琐则考虑使用. 学习闭包的概念,不是python独有的. 其他大多数语言中的函数只是一段可执行的代码,并不是对象. python中的函数是对象 ...

  7. 如何清理ibdata1

    1, 加锁,然后全备份数据,可以用mysqldump,也可以使用其他的工具: [root@localhost data]# mysqldump --all-databases > /root/a ...

  8. Day17-18前端学习之路——常用语句资料库

    一.var 与 let 的区别 var: 可以先初始化再声明该变量; 可以根据需要多次声明相同名称的变量 var myName = 'Chris'; var myName = 'Bob'; let m ...

  9. 常用传输层协议(tcp/ip+udp)与常用应用层协议简述(http)

    一.计算机网络体系结构 二.TCP与UDP差异 1.TCP是面向连接的可靠传输,UDP是面向无连接的不可靠传输 面向连接表现在3次握手,4次挥手:可靠传输表现在未进行4次挥手时的差错重传,超时重传: ...

  10. 泡泡后台Couchbase缓存使用经验分享

    一.导读 爱奇艺的社交业务“泡泡”,拥有日活用户6千万+,后台系统每日高峰期间接口QPS可以达到80K+,与视频业务的主要区别是泡泡业务更多地引入了与用户互动相关的数据,读.写的量均很大.无论是庞大的 ...