selenium-python学习笔记
1.1 操作浏览器基本方法
1.1.1 打开网页
1.从selenium导入webdriver模块
2.打开浏览器(Chrome、Friefox、Ie)
3.打开网站地址
#-*- coding:utf-8 -*-
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
1.1.2 设置休眠
导入time模块,time模块是Python自带的,无需下载,设置等待时间,单位是秒(s)
#-*- coding:utf-8 -*-
from selenium import webdriver
#导入time模块
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#设置休眠时间
time.sleep(3)
1.1.3 页面刷新
1.有时候页面操作后,数据可能没及时同步,需要重新刷新
2.这里可以模拟刷新页面操作,相当于浏览器输入框后面的刷新按钮
#-*- coding:utf-8 -*-
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
#等待3秒刷新页面
driver.refresh()
1.1.4 页面切换
1.当在一个浏览器打开两个页面后,想返回上一页面,相当于浏览器左上角的左 箭头按钮
2.返回到上一页面后,也可以切换到下一页,相当于浏览器左上角的右箭头按钮
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.get("http://www.hordehome.com")
time.sleep(5)
#等待5秒返回上一页
driver.back()
time.sleep(3)
等待3秒切换到下一页
driver.forward()
1.1.5 设置窗口大小
1.可以设置浏览器窗口大小,如设置窗口大小为手机分辨率 540*960
2.也可以最大化窗口
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
#设置窗口大小为540*960
driver.set_window_size(540,960)
time.sleep(2)
#设置浏览器窗口最大化
driver.maximize_window()
1.1.6 截屏
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
#截屏并命名为“test.jpg”保存到F盘
driver.get_screenshot_as_file("F:\\test.jpg")
1.1.7 关闭浏览器
退出有两种方式方式:一直是close();另一种是quit()
1)close 用于关闭当前窗口,当打开的窗口较多时,就可以用 close 关闭部分窗 口
2)quit 用于结束进程,关闭所有的窗口
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.quit()
1.2 常用的8种元素等位
1.2.1 find_element_by_id()
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_id("kw").send_keys("python")
1.2.2 find_element_by_name()
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_name("wd").send_keys("python")
1.2.3 find_element_by_class_name()
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_class_name("s_ipt").send_keys("python")
1.2.4 find_element_by_tag_name()
每个元素都有 tag(标签)属性,如搜 索框的标签属性,就是最前面的 input;在一个页面中,相同的标签有很多,所以一般不用标签来定位。以下 例子,仅供参考和理解,运行肯定报错
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_tag_name("input").send_keys("python")
1.2.5 find_element_by_link_text()
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_link_text("hao123").click()
time.sleep(3)
driver.quit()
1.2.6 find_element_by_partial_link_text()
有时候一个超链接它的字符串可能比较长,如果输入全称的话,会显示很长, 这时候可以用一模糊匹配方式,截取其中一部分字符串就可以了
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_partial_link_text("ao123").click()
time.sleep(3)
driver.quit()
1.2.7 find_element_by_xpath()
xpath 是一种路径语言,跟上面的定位原理不太一样,首先第一步要先学会用 工具查看一个元素的 xpath
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
# 用xpath通过id属性定位
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('Python')
# 用xpath通过name属性定位
driver.find_element_by_xpath('//*[@name="wd"]').send_keys('Python')
# 用xpath通过class属性定位
driver.find_element_by_xpath('//*[@class="s_ipt"]').send_keys('Python')
# 用xpath通过其他属性定位属性定位
driver.find_element_by_xpath('//*[@autocomplete="off"]').send_keys('Python')
time.sleep(3)
driver.quit()
1.2.8 find_element_by_css_selector()
.css 是另外一种语法,比 xpath 更为简洁,可以通过工具查看
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
# css通过id属性定位
driver.find_element_by_css_selector('#kw').send_keys('Python')
# css通过name属性定位
driver.find_element_by_css_selector('[name='wd']').send_keys('Python')
# css通过class属性定位
driver.find_element_by_css_selector('.s_ipt').send_keys('Python')
time.sleep(3)
driver.quit()
介绍一个firefox插件,SeleniumBuilder辅助定位元素,元素定位神器,哪里不会点哪里。
1.3 操作元素(键盘和鼠标事件)
1.3.1 简单操作
1.输入字符串:send_keys()
2.清空输入框:clear()
3.点击事件:click()
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_id("kw").send_keys("python")
driver.find_element_by_id('su').click()
time.sleep(2)
driver.quit()
1.3.2 鼠标悬停事件
1.鼠标丌仅仅可以点击(click),鼠标还有其它的操作,如:鼠标悬停在某个元素上,鼠标 右击,鼠标按住某个按钮拖到
2.鼠标事件需要先导入模块:from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.implicitly_wait(5)
#鼠标悬停在设置按钮上
mouse = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()
3.除了常用的悬停事件外,还有右击鼠标:context_click()、双击鼠标:double_click
1.3.3 多窗口、句柄(handle )
有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操 作,就得先切换窗口了。获取窗口的唯一标识用句柄表示,所以只需要切换句柄, 我们就能在多个页面上灵活自如的操作了。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
driver.implicitly_wait(10)
now_handle = driver.current_window_handle#获取当前窗口句柄
print(now_handle) #输出当前获取的窗口句柄
driver.find_element_by_id("kw").send_keys("python")
driver.find_element_by_id('su').click()
driver.find_element_by_xpath('//*[@id="4001"]/div[1]/h3/a[1]').click()
time.sleep(3)
all_handels = driver.window_handles #获取所有窗口句柄
for handle in all_handels:
if handle != now_handle:
print(handle)#输出等待选择的窗口句柄
driver.switch_to_window(handle)#选择新的浏览器窗口
print(driver.title)#打印title查看是否切换成功
time.sleep(3)
driver.close()#关闭当前窗口
time.sleep(2)
print(now_handle)
driver.switch_to_window(now_handle)#返回主窗口
print(driver.title)#打印title查看是否切换回主窗口
1.3.4 定位一组元素 find_elements
from selenium import webdriver
import random
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("python")
driver.find_element_by_id('su').submit()
driver.implicitly_wait(10)
s=driver.find_elements_by_css_selector('h3.t>a')
t = random.randint(0,9)
s[t].click()
1.3.5 iframe
iframe 标记又叫浮动帧标记,可以用它将一个 HTML 文档嵌入在一个 HTML 中显示。它和 Frame 标记的最大区别是在网页中嵌入 的<iframe></iframe>所包 含的内容与整个页面是一个整体,反正普通定位打死都定位不了,比如:http://mail.163.com/
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://mail.163.com/')
driver.implicitly_wait(10)
# 切换到iframe
#driver.switch_to_frame("x-URS-iframe")
driver.switch_to_frame(driver.find_element_by_id('x-URS-iframe'))
driver.find_element_by_name('email').send_keys('123')
driver.find_element_by_name('password').send_keys('456')
#释放 iframe
driver.switch_to.default_content()
1.3.6 select 下拉框
1.3.6.1 二次定位
driver = webdriver.Chrome()
url = "https://www.baidu.com"
driver.get(url)
driver.implicitly_wait(20)
# 鼠标移动到“设置”按钮
mouse = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()
driver.find_element_by_link_text("搜索设置").click()
# 分两步:先定位下拉框,再点击选项
s = driver.find_element_by_id('nr')
s.find_element_by_xpath("//option[@value='50']").click()
1.3.6.2 直接定位
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
url = "https://www.baidu.com"
driver.get(url)
driver.implicitly_wait(20)
# 鼠标移动到“设置”按钮
mouse = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()
driver.find_element_by_link_text("搜索设置").click()
driver.find_element_by_xpath('.//*[@id="nr"]/option[3]').click()
1.3.6.3 通过索引定位
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
driver = webdriver.Chrome()
url = "https://www.baidu.com"
driver.get(url)
driver.implicitly_wait(20)
# 鼠标移动到“设置”按钮
mouse = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(mouse).perform()
driver.find_element_by_link_text("搜索设置").click()
# 通过索引:select_by_index()
s = driver.find_element_by_id('nr')
Select(s).select_by_index(2)
1.3.6.3 Select 模块其它方法
select_by_index() :通过索引定位
select_by_value() :通过 value 值定位
select_by_visible_text() :通过文本值定位
deselect_all() :取消所有选项
deselect_by_index() :取消对应 index 选项
deselect_by_value() :取消对应 value 选项
deselect_by_visible_text() :取消对应文本选项
first_selected_option() :返回第一个选项
all_selected_options() :返回所有的选项
1.3.7 select alert\confirm\prompt 弹框
1.3.7.1 alert 操作
1.先用 switch_to_alert()方法切换到 alert 弹出框上
2.accept()点击确认按钮
3.dismiss()相当于点右上角 x,取消弹出框
rom selenium import webdriver
import time
driver = webdriver.Chrome()
url = 'file:///C:/Users/drx/Desktop/test.html'
driver.get(url)
driver.find_element_by_id('alert').click()
time.sleep(3)
t = driver.switch_to_alert()
t.accept()
1.3.7.2 confirm 操作
1.先用 switch_to_alert()方法切换到 alert 弹出框上
2.accept()点击确认按钮
3.dismiss()相当于点取消按钮或点右上角 x,取消弹出框
from selenium import webdriver
import time
driver = webdriver.Chrome()
url = 'file:///C:/Users/drx/Desktop/test.html'
driver.get(url)
driver.find_element_by_id('confirm').click()
time.sleep(3)
t = driver.switch_to_alert()
t.accept()
1.3.7.3 prompt 操作
from selenium import webdriver
import time
driver = webdriver.Chrome()
url = 'file:///C:/Users/drx/Desktop/test.html'
driver.get(url)
driver.find_element_by_id('prompt').click()
time.sleep(3)
t = driver.switch_to_alert()
t.send_keys('泡面')
time.sleep(3)
t.accept()
1.3.8 富文本
定位富文本框,首先需要进行iframe切换
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
url = 'http://www.cnblogs.com/langping/'
driver.get(url)
driver.implicitly_wait(20)
driver.find_element_by_id('blog_nav_newpost').click()
driver.find_element_by_id('input1').send_keys('用户名')
driver.find_element_by_id('input2').send_keys('密码')
driver.find_element_by_id('signin').click()
driver.find_element_by_id('Editor_Edit_txbTitle').send_keys('selenium')
driver.switch_to_frame('Editor_Edit_EditorBody_ifr') #切换到iframe
driver.find_element_by_id('tinymce').send_keys(Keys.TAB)
driver.find_element_by_id('tinymce').send_keys(u'哇哈哈')
driver.switch_to_default_content() #释放 iframe
driver.find_element_by_name('Editor$Edit$lkbDraft').click()
1.3.9 上传文件
driver = webdriver.Chrome()
from selenium.webdriver.common.keys import Keys
url = 'http://www.cnblogs.com/langping/'
driver.get(url)
driver.implicitly_wait(20)
driver.find_element_by_id('blog_nav_newpost').click()
driver.find_element_by_id('input1').send_keys('用户名')
driver.find_element_by_id('input2').send_keys('密码')
driver.find_element_by_id('signin').click()
driver.find_element_by_css_selector('#Editor_Edit_EditorBody_uploadImage > span.mceIcon.mce_uploadImage > img').click()
iframe = driver.find_elements_by_tag_name('iframe')[1] #定位所有的iframe,取第二个frmae
driver.switch_to_frame(iframe)
driver.find_element_by_name('file').send_keys('C:\Users\drx\Desktop\\abc.png')
driver.switch_to_default_content() #释放 ifram
1.4 获取元素属性
通常在做断言之前,都要先获取界面上元素的属性,然后与期望结果对比。本篇 介绍几种常见的获取元素属性方法。
1.4.1 获取页面 title
from selenium import webdriver
import time
driver = webdriver.Chrome()
url = "https://www.baidu.com"
driver.get(url)
time.sleep(2)
title = driver.title #获取title
print(title)
1.4.2 获取元素的文本
from selenium import webdriver
import time
driver = webdriver.Chrome()
url = "https://www.baidu.com"
driver.get(url)
time.sleep(2)
text = driver.find_element_by_css_selector('#lh > a:nth-child(4)').text #获取元素文本
print(text)
1.4.3 获取元素的标签
from selenium import webdriver
import time
driver = webdriver.Chrome()
url = "https://www.baidu.com"
driver.get(url)
time.sleep(2)
tag = driver.find_element_by_id('su').tag_name #获取元素的标签
print(tag
print(text)
1.4.4 获取元素的其它属性
获取其它属性方法:get_attribute("属性"),这里的参数可以是 class、name 等任意属性
from selenium import webdriver
import time
driver = webdriver.Chrome()
url = "https://www.baidu.com"
driver.get(url)
time.sleep(2)
name = driver.find_element_by_id('kw').get_attribute('name') #获取元素的name属性
print(name)
1.4.5 获取输入框内的文本值
from selenium import webdriver
import time
driver = webdriver.Chrome()
url = "https://www.baidu.com"
driver.get(url)
time.sleep(2)
driver.find_element_by_id('kw').send_keys(u'你大爷')
value = driver.find_element_by_id('kw').get_attribute("value")
print(value)
1.4.6 获取浏览器名称
from selenium import webdriver
import time
driver = webdriver.Chrome()
print(driver.name)
1.5 cookie 相关操作
虽然 cookie 相关操作在平常 ui 自动化中用得少,偶尔也会用到,比如登录有图 形验证码,可以通过绕过验证码方式,添加 cookie 方法登录
1.5.1 获取 cookies :get_cookies()
from selenium import webdriver
import time
driver = webdriver.Chrome()
# 启动浏览器后获取cookies
print(driver.get_cookies())
driver.get('http://www.cnblogs.com/langping/')
# 打开主页后获取cookies
driver.find_element_by_id('blog_nav_newpost').click()
print(driver.get_cookies())
# 登陆后获取cookies
driver.find_element_by_id('input1').send_keys('usernam')
driver.find_element_by_id('input2').send_keys('password')
driver.find_element_by_id('signin').click()
time.sleep(2)
print(driver.get_cookies())
1.5.2 cookie操作的几个方法
1.get_cookies() #获取所有 cookies
2.driver.get_cookie(name)#获取指定 name 的 cookie
3.delete_cookie() #清除指定 cookie
4.delete_all_cookies() #清除所有 cookies
5.add_cookie(cookie_dict) #添加 cookie 的值
1.5.3 添加 cookie
# coding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.cnblogs.com/langping")
# # 添加 cookie
c1 = {u'domain': u'.cnblogs.com',
u'name': u'.CNBlogsCookie',
u'value': u'xxxx',
u'expiry': 1491887887,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
c2 = {u'domain': u'.cnblogs.com',
u'name': u'.Cnblogs.AspNetCore.Cookies',
u'value': u'xxxx',
u'expiry': 1491887887,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
driver.add_cookie(c1) # 添加 2 个值
driver.add_cookie(c2)
time.sleep(3)
1.6 JS 处理滚动条
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').click()
time.sleep(2)
# 滚动条拉到底部
js = 'var q=document.documentElement.scrollTop=10000'
driver.execute_script(js)
time.sleep(2)
# 滚动条拉到顶部部
js = 'var q=document.documentElement.scrollTop=0'
driver.execute_script(js)
1.7 JS 处理日历控件
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://kyfw.12306.cn/otn/index/init')
#去掉元素的readonly属性
js = 'document.getElementById("train_date").removeAttribute("readonly");'
driver.execute_script(js)
#清空文本后输入值
driver.find_element_by_id('train_date').clear()
driver.find_element_by_id('train_date').send_keys('2017-10-10')