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:UsersAdministratorDesktop接口测试示例.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()