首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自动化-Selenium 3-常用API(Python版)

自动化-Selenium 3-常用API(Python版)

作者头像
wangmcn
发布2022-07-22 15:51:35
发布2022-07-22 15:51:35
1.5K00
代码可运行
举报
文章被收录于专栏:AllTests软件测试AllTests软件测试
运行总次数:0
代码可运行

常用API

第1章 浏览器操作

1、浏览器窗口大小设置

代码语言:javascript
代码运行次数:0
运行
复制
# 设置浏览器宽480、高800
driver.set_window_size(480, 800)
# 浏览器窗口最大化
driver.maximize_window()

2、浏览器页面前进后退

代码语言:javascript
代码运行次数:0
运行
复制
# 前进
driver.forward()
# 后退
driver.back()

3、浏览器页面刷新

代码语言:javascript
代码运行次数:0
运行
复制
# 刷新
driver.refresh()

4、浏览器关闭

代码语言:javascript
代码运行次数:0
运行
复制
# 关闭当前窗口
driver.close()
# 退出驱动并关闭所有关联的窗口
driver.quit()

5、脚本代码:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
"""
浏览器操作
"""
options = webdriver.ChromeOptions()
options.add_argument('disable-infobars')
driver = webdriver.Chrome(chrome_options=options)
driver.get("http://www.baidu.com")

# 设置浏览器宽480、高800
driver.set_window_size(480, 800)
time.sleep(2)

# 浏览器窗口最大化
driver.maximize_window()
time.sleep(2)

driver.get("https://cn.bing.com")
time.sleep(2)

# 刷新
driver.refresh()
time.sleep(2)

# 后退
driver.back()
time.sleep(2)

# 前进
driver.forward()
time.sleep(2)

# 关闭当前窗口
driver.close()
time.sleep(2)

# 退出驱动并关闭所有关联的窗口
driver.quit()

第2章 下拉菜单选择

如图所示:带有标签的下拉菜单选择页面源码

1、使用Select类来处理下拉菜单

代码语言:javascript
代码运行次数:0
运行
复制
select = Select(driver.find_element_by_id('select-demo'))

# 通过value来选择,例如:香蕉
select.select_by_value('banana')

# 通过index来选择(从0开始),例如:葡萄
select.select_by_index(2)

# 通过text来选择,例如:苹果
select.select_by_visible_text('苹果')

2、脚本代码:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time
import os
"""
下拉菜单选择
"""
file_path = 'file:///' + os.path.abspath('html/select.html')
options = webdriver.ChromeOptions()
options.add_argument('disable-infobars')
driver = webdriver.Chrome(chrome_options=options)
driver.get(file_path)
select = Select(driver.find_element_by_id('select-demo'))
time.sleep(2)

# 通过value来选择,例如:香蕉
select.select_by_value('banana')
time.sleep(2)

# 通过index来选择(从0开始),例如:葡萄
select.select_by_index(2)
time.sleep(2)

# 通过text来选择,例如:苹果
select.select_by_visible_text('苹果')
time.sleep(2)

driver.quit()

第3章 鼠标事件

ActionChains类提供的鼠标事件常用方法(perform()执行所有ActionChains中存储的行为):

1、双击double_click()

例如:双击百度搜索框

百度搜索框页面源码

代码语言:javascript
代码运行次数:0
运行
复制
# 定位到要双击的元素
double_click = driver.find_element_by_id("kw")
# 双击操作
ActionChains(driver).double_click(double_click).perform()

2、右击context_click()

例如:百度搜索框内右击操作

代码语言:javascript
代码运行次数:0
运行
复制
# 定位到要右击的元素
right_click = driver.find_element_by_id("kw")
# 右击操作
ActionChains(driver).context_click(right_click).perform()

3、悬停move_to_element()

例如:悬停设置按钮

设置页面源码

代码语言:javascript
代码运行次数:0
运行
复制
# 定位到要悬停的元素
above = driver.find_element_by_class_name("pf")
# 悬停操作
ActionChains(driver).move_to_element(above).perform()

4、拖放操作drag_and_drop(source, target)

在源元素上按下鼠标左键,然后移动到目标元素上释放。

source:鼠标拖动的源元素。

target:鼠标释放的目标元素。

例如:将Drag me拖放到Item 2

页面源码

代码语言:javascript
代码运行次数:0
运行
复制
# 定位元素的源位置
element = driver.find_element_by_id("dragger")
# 定位元素要移动到的目标位置
target = driver.find_element_by_xpath("//div[text()='Item 2']")
# 拖放操作
ActionChains(driver).drag_and_drop(element,target).perform()

5、脚本代码:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
"""
鼠标事件
"""
options = webdriver.ChromeOptions()
options.add_argument('disable-infobars')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("Selenium")
time.sleep(2)

# 定位到要双击的元素
double_click = driver.find_element_by_id("kw")
# 双击操作
ActionChains(driver).double_click(double_click).perform()
time.sleep(2)

# 定位到要右击的元素
right_click = driver.find_element_by_id("kw")
# 右击操作
ActionChains(driver).context_click(right_click).perform()
time.sleep(2)

# 定位到要悬停的元素
above = driver.find_element_by_class_name("pf")
# 悬停操作
ActionChains(driver).move_to_element(above).perform()
time.sleep(2)

driver.get("http://sahitest.com/demo/dragDropMooTools.htm")
time.sleep(2)

# 定位元素的源位置
element = driver.find_element_by_id("dragger")
# 定位元素要移动到的目标位置
target = driver.find_element_by_xpath("//div[text()='Item 2']")
# 拖放操作
ActionChains(driver).drag_and_drop(element,target).perform()
time.sleep(2)

driver.quit()

第4章 键盘事件

1、使用Keys类来处理键盘操作:

代码语言:javascript
代码运行次数:0
运行
复制
send_keys(Keys.BACK_SPACE) 删除键(Backspace)

send_keys(Keys.SPACE) 空格键(Space)

send_keys(Keys.TAB) Tab键

send_keys(Keys.ESCAPE) 回退键(Esc)

send_keys(Keys.ENTER) 回车键(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

send_keys(Keys.F12) 键盘F12

2、脚本代码:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
"""
键盘事件
"""
options = webdriver.ChromeOptions()
options.add_argument('disable-infobars')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("Selenium")
time.sleep(2)

# Ctrl+A 全选操作
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(2)

# Ctrl+C 复制操作
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'c')
time.sleep(2)

driver.get("http://cn.bing.com")
time.sleep(2)

# Ctrl+V 粘贴操作
driver.find_element_by_id("sb_form_q").send_keys(Keys.CONTROL,'v')
time.sleep(2)

# 回车键操作
driver.find_element_by_id("sb_form_q").send_keys(Keys.ENTER)
time.sleep(2)

driver.quit()

第5章 元素等待

1、显示等待

在设定时间内,针对某一个元素,默认每隔一段时间检测该元素是否存在,如果超过设定时间检测不到则抛出异常。

WebDriverWait()

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

driver - WebDriver的驱动程序(IE、Firefox、Chrome等)

timeout - 最长超时时间,默认以秒为单位

poll_frequency - 休眠时间的间隔(步长)时间,默认为0.5秒

ignored_exceptions - 超时后的异常信息,默认情况下抛NoSuchElementException异常。

until()、until_not()

WebDriverWait()一般由until()或until_not()方法配合使用。

until(method, message=’ ’)

调用该方法提供的驱动程序作为一个参数,直到返回值为Ture。

until_not(method, message=’ ’)

调用该方法提供的驱动程序作为一个参数,直到返回值为False。

expected_conditions

在本章示例中,我们在使用expected_conditions类时对其进行了重命名,通过as关键字对其重命名为EC。并调用presence_of_element_located()判断元素是否存在。

expected_conditions 提供一些预期条件的实现。

title_is 用于判断标题是否xx。

title_contains 用于判断标题是否包含xx信息。

presence_of_element_located 元素是否存在。

visibility_of_element_located 元素是否可见。

visibility_of 是否可见。

presence_of_all_elements_located 判断一组元素是否存在。

text_to_be_present_in_element 判断元素是否有xx文本信息。

text_to_be_present_in_element_value 判断元素值是否有xx文本信息。

frame_to_be_available_and_switch_to_it 表单是否可用,并切换到该表单。

invisibility_of_element_located 判断元素是否隐藏。

element_to_be_clickable 判断元素是否点击,它处于可见和启动状态。

staleness_of 等到一个元素不再是依附于DOM。

element_to_be_selected 被选中的元素。

element_located_to_be_selected 一个期望的元素位于被选中。

element_selection_state_to_be 一个期望检查如果给定的元素被选中。

element_located_selection_state_to_be 期望找到一个元素并检查是否选择状态。

alert_is_present 预期一个警告信息。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
# 显式等待
element = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"kw")))
element.send_keys('Selenium')

除了expected_conditions所提供的预期方法,也可以使用is_displayed()方法来判断元素是否可见。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
# 判断id为kw元素是否可见
element = WebDriverWait(driver,5,0.5).until(lambda x: x.find_element_by_id("kw").is_displayed())
print(element)

2、隐式等待

隐式等待是通过一定的时长等待页面所有元素加载完成。如果超出了设置的时长,元素还没有被加载则抛NoSuchElementException异常。

implicitly_wait()方法来实现隐式等待,默认单位为秒。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
# 隐式等待
driver.implicitly_wait(5)
try:
    driver.find_element_by_id("su").click()
except NoSuchElementException as msg:
    print(msg)

3、sleep休眠

当执行到sleep()方法时会固定的休眠所设置的时长,然后再继续执行。

sleep()方法默认参数以秒为单位,如果设置时长小于1秒,可以用小数点表示,如:time.sleep (0.5)

例如:

代码语言:javascript
代码运行次数:0
运行
复制
# sleep休眠
time.sleep(2)

4、脚本代码:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
import time
"""
元素等待
"""
options = webdriver.ChromeOptions()
options.add_argument('disable-infobars')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.baidu.com")

# 显式等待
element = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"kw")))
element.send_keys('Selenium')

# 判断id为kw元素是否可见
element = WebDriverWait(driver,5,0.5).until(lambda x: x.find_element_by_id("kw").is_displayed())
print(element)

# 隐式等待
driver.implicitly_wait(5)
try:
    driver.find_element_by_id("su").click()
except NoSuchElementException as msg:
    print(msg)

# sleep休眠
time.sleep(2)

driver.quit()

第6章 多表单切换

在Web应用中经常会遇到表单嵌套页面,Frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位;而frame和iframe需要切换进去才能定位到其中的元素。这时就需要通过switch_to.frame()方法将当前定位的主体切换为 frame/iframe表单的内嵌页面中。

如图所示:输入框frame div在层frameA内,要想输入操作则需要进入层frameA。

页面源码:

1、switch_to.frame() 默认可以直接取表单的id或name属性进行切换,也可以用Xpath等。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
driver.switch_to.frame("frameA")
driver.switch_to.frame(driver.find_element_by_xpath("//iframe[@src='frame2.html']"))

2、switch_to.parent_frame() 跳出当前层

3、switch_to.default_content() 返回最外层

4、脚本代码:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import os
"""
多表单切换
"""
file_path = 'file:///' + os.path.abspath('html/frame1.html')
options = webdriver.ChromeOptions()
options.add_argument('disable-infobars')
driver = webdriver.Chrome(chrome_options=options)
driver.get(file_path)
driver.find_element_by_id("maininput").send_keys("Selenium1")
time.sleep(2)

# 跳进层
driver.switch_to.frame("frameA")
driver.find_element_by_id("iframeinput").send_keys("Selenium2")
time.sleep(2)

# 跳出当前层
driver.switch_to.parent_frame()

# 跳进层
driver.switch_to.frame(driver.find_element_by_xpath("//iframe[@src='frame2.html']"))
driver.find_element_by_id("iframeinput").send_keys("Selenium3")
time.sleep(2)

# 返回最外层
driver.switch_to.default_content()

driver.quit()

第7章 多窗口切换

在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要切换到新打开的窗口上进行操作。switch_to.window()方法可以实现在不同的窗口之间切换。

current_window_handle 获得当前窗口句柄

window_handles 获取所有窗口句柄

switch_to.window() 切换窗口

如图所示:百度搜索页点击立即注册后,会弹出注册账号页面。

脚本代码:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
"""
多窗口切换
"""
options = webdriver.ChromeOptions()
options.add_argument('disable-infobars')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.baidu.com")
driver.implicitly_wait(5)

# 获取搜索窗口句柄
sreach_windows = driver.current_window_handle
driver.find_element_by_link_text("登录").click()
driver.find_element_by_link_text("立即注册").click()

# 获取所有窗口句柄
all_handles = driver.window_handles

# 进入注册窗口页面
for handle in all_handles:
    if handle != sreach_windows:
        # 切换窗口
        driver.switch_to.window(handle)
        driver.find_element_by_name("userName").send_keys("userName")
        time.sleep(2)

# 进入搜索窗口页面
for handle in all_handles:
    if handle == sreach_windows:
        # 切换窗口
        driver.switch_to.window(handle)
        driver.find_element_by_class_name("close-btn").click() driver.find_element_by_id("kw").send_keys("Selenium")
        driver.find_element_by_id("su").click()
        time.sleep(2)

driver.quit()

- End -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AllTests软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第1章 浏览器操作
  • 第2章 下拉菜单选择
  • 第3章 鼠标事件
  • 第4章 键盘事件
  • 第5章 元素等待
  • 第6章 多表单切换
  • 第7章 多窗口切换
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档