1、selenium环境搭建
(1)安装python:地址https://www.python.org/
(2)安装selenium:在命令行安装pip install selenium
(3)安装浏览器及其驱动
安装浏览器以及其对应版本的驱动。
Chrome浏览器驱动:https://chromdriver.storage.googleapis.com/index.html
Firefox浏览器驱动:https://github.com/mozilla/geckodriver/releases
IE浏览器驱动:https://selenium-release.storage.googleapis.com/index.html
(4)脚本开发工具:Pycharm
2、常用方法
from selenium import webdriver #引入webdriver
driver=webdriver.Chrom() #启动浏览器
driver.get("https://www.baidu.com") #打开百度
driver.set_window_size(480,800) #改变浏览器像素大小
driver.maximize_window() #最大化浏览器窗口
driver.implititly_wait(30) #隐式等待30秒
driver.back() #后退到上一个页面
driver.forward() #请进到下一个页面
driver.refresh() #浏览器刷新
driver.close() #关闭当前窗口,浏览器不关闭
driver.quit() #关闭所有窗口及浏览器驱动
driver.add_cookie() #添加cookie
driver.get_cookies() #获取cookies
driver.current_window_handle #获取当前窗口
driver.window_handles #获取浏览器全部窗口
driver.switch_to.window() #切换窗口
driver.switch_to.frame(driver.find_element_by_id('kw')) #切换内嵌式框架frame,可以通过索引、id和name属性值、元素对象定位
driver.switch_to.default_content() #回到主文档
driver.switch_to.parent_frame() #回到当前内嵌式框架frame的上一层
driver.excute_script(js) #执行js语句
driver.title #获取当前窗口的标题
3、常用元素操作方法
locator=driver.find_element_by_xpath("//a[contains(@class,'bg')") #定位元素
locator.clear() #清空元素的文本信息
locator.click() #点击元素
locator.send_keys("值") #输入值
locator.submit() #提交表单
locator.text #获取元素文本
locator.size() #获取元素大小
locator.get_attribute("class") #获取元素属性值
4、selenium常用定位方法
driver.find_element_by_id("kw") #标签属性id定位
driver.find_element_by_name("kw") #标签属性name定位
driver.find_element_by_class_name("kw") #标签属性class name定位
driver.find_element_by_tag_name("input") #标签名定位
driver.find_element_by_link_text("地图") #标签<a>文本定位
driver.find_element_by_pritial_link_text("地") #link text定位补充
driver.find_element_by_css_selector(".kw") #css selector定位
driver.find_element_by_xpath("//input[@id='kw']") #xpath定位
#使用by类定位
from seleium.webdriver.common.by import By
driver.find_element(By.ID,'KW')
(1)css selector定位
选择器 | 例子 | 例子描述 |
.class | .intro | 选择class="intro"的所有元素 |
#id | #kw | 选择的id="kw"所有元素 |
element>element | div>p | 选择<div>元素的所有<p>子元素 |
element element | div p | 选择<div>元素内部的所有<p>子元素 |
element+element | div+p | 选择同一级中紧接在<div>元素之后的所有<p>元素 |
[attribute^=value] | a[src^="https"] | 选择属性src以“https”开头的<a>元素 |
[attribute$=value] | a[src$=".pdf"] | 选择属性src以“.pdf”结尾的<a>元素 |
[attribute*=value] | a[src*="abc"] | 选择属性src包含“abc”的<a>元素 |
:nth-child | input:nth-child(1) | 选择其父元素中的第一个子元素,如果第一个子元素不为input,则结果为0 |
:nth-child(1) | 选择父级元素中的第一个子元素 | |
:nth-of-type | input:nth-of-type(1) | 选择父元素中的第一个input子元素 |
(2)Xpath定位
xpath可以使用相对定位和绝对定位,绝对定位的定位方法是以“/”开头,相对定位是以“//”开头
#例如:
driver.find_element_by_xpath("/html/body/div[2]/div/div/form/span/input") #绝对定位
driver.find_element_by_xpath("//input[@id="kw"]") #相对定位
使用逻辑运算符
driver.find_element_by_xpath("//input[@name='wd' and @class='s_ipt']")
使用contains模糊匹配
driver.find_element_by_xpath("//a[contains(@class,'bg')")
driver.find_element_by_xpath("//a[contains(@text(),'新闻')")
driver.find_element_by_xpath("//a[text()=''新闻]")
text()方法用于标识HTML中的文本。
(3)By类定位
八种定位方式对照表
id | By.ID |
name | By.NAME |
class_name | By.CLASS_NAME |
tag_name | By.TAG_NAME |
link_text | By.LINK_TEXT |
partrial_link_text | By.PARTRIAL_LINK_TEXT |
css_selector | By.CSS_SELECTOR |
xpath | By.XAPTH |
5、切换窗口
handles=driver.window_handles #获取全部窗口
new_handle=driver.current_window_handle #获取当前窗口
for handle in handles: #遍历循环所有窗口
if handle != new_handle: #判定是否当前窗口一致
driver.switch_to.window(handle) #不是就进行切换
break #结束循环
6、切换内嵌框架frame
driver.switch_to.frame(1) #通过idexd定位,起始为0
driver.switch_to.frame("kw") #通过id定位
driver.switch_to.frame("kd") #通过name定位
driver.switch_to.frame(driver.find_element_by_id('kw')) #通过元素对象定位
driver.switch_to.default_content() #回到主文档
driver.switch_to.parent_frame() #回到上一层
注意: 切换框架,只能切换到父级再到子级,不能直接到孙级
7、下拉框标签select、option
from selenium.webdriver.support import Select #引入Select类
locator=driver.find_element_by_id("source") #定位select元素
select=Select(locator) #实例化类赋值
select.select_by_visible_text("网络") #通过可见文本赋值
select.select_by_value(“网络”) #通过value属性赋值
select.select_by_index(0) #通过索引赋值
8、弹窗处理
from selenium.webdriver.common.alert import Alert #引入类Alert
alter=Alert(driver) #实例化类
alter.accept() #确认警告框
alter.dismiss() #取消警告框
alter.send_keys() #输入值
9、javascript调用
(1)窗口滚动
from seleium import WebDriver
xy=driver.find_element_by_tag_name("html").size #获取页面的尺寸
js="window.scroll(0,num)”" #实现窗口滚动,num可以通过上述xy获取
driver.excute_script(js) #执行js语句
(2)js的几种定位方式
js="document.getElementById()" #根据id定位元素
js="document.getElementsByName()" #根据name定位元素
js="document.getElementsTagName()" #根据tag name定位元素
js="document.getElementsClassName()" #根据class name定位元素
driver.excute_script(js) #执行js语句
(3)js的几种对元素操作方法
# 使用 JavaScript 定位元素和操作
js="document.getElementById('kw').removeAttribute(‘readonly’)" #去掉属性readonly属性
js="document.getElementById('kw').setAttribute('name','kd')" #添加name属性
js="document.getElementById('kw').click()" #点击元素
js="document.getElementById('kw').value='刘德华'" #修改属性值
driver.excute_script(js) #执行js语句
# 使用 selenium定位元素,JavaScript 操作元素,一般用于不可见元素
element = driver.find_element(By.ID, "hidden_element_id")
driver.execute_script("arguments[0].click();", element)
注意:使用 javascript语句最后需要加上execute_script方法
10、设置等待
(1)强制等待
from time import sleep #引入sleep
sleep(3) 睡眠3秒
(2)隐式等待
driver.implicitly_wait(30) #一般在打开浏览器后就使用,等待30秒
(3)显示等待
from selenium.webdriver.support.ui import WebDriverWait #引入WebDriverWait
from selenium.webdriver.support import export_conditions as EC #引入EC
wait= WebDriverWait(driver,10,1) #实例化WebDriverWait,总等待时间10秒,间隔刷新等待时间1秒
wait.until(EC.presence_of_element_located(By.ID,"kw")) #等待id="kw"的元素出现
11、截图
driver.save_screenshot(".\abc.png") #截当前页面的图,可以使用相对路径绝对路径
driver.get_screenshot_as_file("c:\\abc.png") #截长图,也可以使用相对路径和绝对路径
12、鼠标事件
from seleium.webdriver.common.action_chains import ActionChains
from seleium.webdriver.common.by import By
locator=driver.find_element(By.ID,"kw")
action=ActionChains(driver) #实例化类
action.move_to_element(location).perform() #鼠标悬停
场景鼠标事件
context_click(locator) | 鼠标右键单击 |
double_click(locator) | 左键双击 |
drag_and_drop(source_locator,target_locator) | 鼠标拖动,从source_locator拖到target_locator |
move_to_element(locator) | 鼠标悬停 |
click_and_hold(locator) | 按下鼠标左键 |
13、键盘操作
from seleium.webdriver.common.keys import Keys
from seleium.webdriver.common.by import By
driver.find_element(By.ID,"kw").send_keys(Keys.BACK_SPACE) #发送删除键(BackSpace)
其它常用键盘事件
Keys值 | 含义 |
send_keys(Keys,BACK_SPACE) | 删除键(BackSpace) |
send_keys(Keys,SPACE) | 空格键 |
send_keys(Keys,TAB) | Tab键 |
send_keys(Keys,ESCAPEE) | ESC键 |
send_keys(Keys,ENTER) | 回车键 |
send_keys(Keys.CONTROL,"a") | Ctrl+A全选 |
send_keys(Keys.CONTROL,"c") | Ctrl+C复制 |
send_keys(Keys.CONTROL,"x") | Ctrl+X剪贴 |
send_keys(Keys.CONTROL,"v") | Ctrl+V粘贴 |
send_keys(Keys,F1) | F1~F12 |
… | |
send_keys(Keys,F12) |