Particles

webdriver中的定位\模拟\及实例

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()

posted @ 2020-01-10 18:59  Na_years  阅读(448)  评论(0编辑  收藏  举报