5.4. selenium webdriver api介绍

在上一节中, 我们使用requests发送http请求,调用了chromedriver的操作浏览器的web api,看起来有点繁琐,但我们只是演示用来理解webdriver原理的,生产中我们完全不用这么干 这些繁琐的调用selenium这个项目已经帮我们封装好了,selenium就是干这个事儿的,就是封装了对webdriver的web api调用的客户端实现,如下脚本是实现了对BOPS后台的登录功能

import time
from selenium import webdriver

# 创建driver对象
driver = webdriver.Chrome()
driver.implicitly_wait(30)

# 打开登录页
driver.get('http://bopsadmin.test.apitops.com')

# 输入登录用户名
driver.find_element_by_id('loginName').send_keys('top')

# 输入登录密码
driver.find_element_by_id('password').send_keys('123456')

# 点击登录
driver.find_element_by_id('btnLoginCRM').click()

# 等待5秒后退出
time.sleep(5)
driver.quit()

可以看到,我们没有手工发送一个http请求,但我们完成了浏览器的操作,这就是selenium webdriver的作用,下面我们介绍一些常用的api

5.4.1. 浏览器操作

# 打开登录页
driver.get('http://bopsadmin.test.apitops.com')

# 浏览器当前地址
driver.current_url
# 后退
driver.back()

# 前进
driver.forward()

# 刷新
driver.refresh()

# 最大化
driver.maximize_window()

5.4.3. 元素定位

# 通过id定位
driver.find_element_by_id('xxx')

# 通过name属性定位
driver.find_element_by_name('xxx')

# 通过classname定位
driver.find_element_by_class_name('xxx')

# 通过css选择器定位
driver.find_element_by_css_selector('xxx')

# 通过xpath定位
driver.find_element_by_xpath('//xxx')

# 通过tag name定位
driver.find_element_by_tag_name('xxx')

# 通过链接的文字
driver.find_element_by_link_text('xxx')

# 通过部分链接文字
driver.find_element_by_partial_link_text('xxx')

5.4.4. 元素操作

# 点击元素
web_element.click()

# 清空输入框(这个方法用于输入框有效)
web_element.clear()

# 输入字符(这个方法用于输入框)
web_element.send_keys('xxx')

# 获取属性
web_element.get_attribute('xxx')

# 元素是否可见
web_element.is_displayed()

# 元素是否enable
web_element.is_enabled()

# 元素是否选中(针对选项框或单选框)
web_element.is_selected()

# 提交(针对表单的提交按钮,不过一般用click就够了)
web_element.submit()

# 截图
web_element.save_screenshot('xxx.png')

5.4.5. 窗口对象操作

# 当前浏览器窗口引用
driver.current_window_handle

# 当前所有的浏览器窗口引用集合
driver.window_handles

# 切换到指定窗口,通过窗口名或窗口引用
driver.switch_to.window('window_name')

5.4.6. 弹窗处理

# 确定浏览器弹窗
driver.switch_to.alert.accept()

# 取消浏览器弹窗
driver.switch_to.alert.dismiss()

5.4.7. frame操作

现在前端基本上已经不使用frame了。。 不过还是有必要讲一下:

"""
Switches focus to the specified frame, by index, name, or webelement.

:Args:
- frame_reference: The name of the window to switch to, an integer representing the index,
                    or a webelement that is an (i)frame to switch to.

:Usage:
    driver.switch_to.frame('frame_name')
    driver.switch_to.frame(1)
    driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
"""

driver.switch_to.frame('xxxx')

# 恢复到默认的frame
driver.switch_to.default_content()

5.4.8. 时间相关

# 隐式等待元素被发现,一个driver session只需要调用一次
driver.implicitly_wait(30)

# 设置页面加载超时时间
driver.set_page_load_timeout(30)

# 设置脚本超时时间
driver.set_script_timeout(30)

# 等带某个元素出现(在timeout秒内出现locator)
import selenium.webdriver.support.ui as ui
import selenium.webdriver.support.expected_conditions as EC
ui.WebDriverWait(driver, timeout).until(EC.visibility_of_element_located((By.XPATH, locator)))

5.4.9. 其它不常用操作

# 异步执行JS脚本
driver.execute_async_script('alert(123)')

# 同步执行JS脚本
driver.execute_script('alert(123)')

# 获取浏览器窗口大小
driver.get_window_size()

# 获取浏览器窗口在屏幕中的坐标
driver.get_window_rect()

# 设置窗口位置
driver.set_window_position()

# 设置窗口大小
driver.set_window_size()

5.4.10. 鼠标事件

鼠标事件方法被通常封装是ActionChains中

#右击
context_click()

#双击
double_click()

#拖动
drag_and_drop()

#鼠标悬停
move_to_element()

#滚动到元素target_xpath
target = driver.find_element_by_xpath(target_xpath)
driver.execute_script("arguments[0].scrollIntoView();", target_xpath)

5.4.11. 键盘事件

在使用键盘按钮方法前需要先导入keys类

from selenium.webdriver.common.keys import Keys

# 以下为常用的键盘操作
send_keys(Keys.BACK_BACK_SPACE) # 删除键
send_keys(Keys.BACK_SPACE)      # 空格键
send_keys(Keys.Tab)             # 制表键(Tab)
send_keys(Keys.ESCAPE)          # 回退键(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