WeDriver 模拟浏览器的操作

WeDriver 对浏览器的操作

WeDriver主要提供的是操作页面上各种元素的方法,
但它也提供了操作浏览器的一些方法,例如控制浏览器的大小,操作浏览器的前进和后退等。

打开浏览器驱动

  • 打开浏览器驱动driver = webdriver.Chrome()
  • 打开网址driver.get()

控制浏览器窗口大小

希望浏览器以某种尺寸打开,让访问的网页在这种尺寸下运行。WeDriver对浏览器窗体可以实现指定屏幕坐标位置窗体尺寸、最大化,但无法最小化浏览器窗口

WeDriver提供了driver.set_window_size()方法来设置浏览器的大小。

  • 设置浏览器最大化driver.maximize_window()
  • 浏览器以某种尺寸显示driver.set_window_size(x,y)

控制浏览器后退、前进

在使用浏览器浏览网页时,浏览器提供了后退和前进按钮,可以方便的在浏览过的页面之间来回切换,WeDriver提供了对应的back()和forward()方法来模拟后退和前进按键。

  • 前进driver.forward()
  • 后退driver.back()

模拟浏览器刷新

有时候需要手动刷新页面,才能够更新信息,WeDriver提供了refresh()方法。

  • 刷新driver.refresh()

模拟浏览器截屏

get_screenshot_as_file(filename)

模拟浏览器关闭

WeDriver提供了两种关闭的方法,close()关闭单个页面,quit()关闭所有页面。

  • close():用于关闭当前窗口,当打开的窗口较多时,就可以用close关闭部分窗口
  • quit():quit用于结束进程,关闭所有的窗口。最后测试结束的时候,建议用quit
练习

需求:
控制浏览器窗口的大小:(400,800)
窗口的前进及后退:
百度跳转到新闻
新闻后退到百度
百度前进到新闻

from  selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#控制浏览器窗口的大小:(400,800)
driver.set_window_size(1300,500)
driver.maximize_window()
driver.refresh()
time.sleep(3)
#   窗口的前进及后退:
# driver.find_element_by_link_text("新闻").click()
# time.sleep(3)
# driver.back()
# time.sleep(3)
# driver.forward()
driver.quit()

需求:
打开淘宝网。
点击聚划算,进入聚划算页面。
选择“女装”,进入女装页面。
返回到聚划算页面。

from  selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.taobao.com")

#获取当前浏览器上两个页面的handle值
handles = driver.window_handles
print(handles)
#将操作的权限交给聚划算页面
driver.switch_to_window(handles[1])
time.sleep(1)
#选择“女装”,进入女装页面。
#点击的是淘宝页面的女装?如果点聚划算页面的女装按钮
#多窗口的切换
#每个页面都有自己的一个句柄handle
driver.find_element_by_link_text("女装").click()
time.sleep(1)
#返回到聚划算页面。
driver.back()
time.sleep(1)
#退出浏览器
driver.quit()

鼠标、键盘操作

鼠标事件

前面讲到click()是模拟鼠标的单击操作,现在的web产品中提供了更丰富的交互方式。
例如:鼠标右击、双击、悬停,甚至是鼠标拖动等功能。

WebDriver中,这些方法封装在ActionChains类中,需要导入以下包:
from selenium.webdriver.common.action_chains import ActionChains

常见方法有:

  • click() :单击鼠标左键
  • perform():执行所有ActionChains存储的行为
  • context_click():右击
  • double_click(): 双击
  • drag_and_drop():拖动
  • move_to_element():鼠标悬停
  • 定位元素
    ActionChains(driver).move_to_element(定位的元素).perform()

键盘操作

前面了解到,在文本框中进行操作,可以用:

  • send_keys() 方法用来模拟键盘,
  • clear() 清空信息/清空文本框
  • submit() 提交表单/模拟回车

Keys()类提供里键盘上几乎所有的按键的方法
除此之外,我们还可以用它来输入键盘上的按键,甚至是组合键,如:
Crtl+A,Crtl+C等。

需要导入以下包
from selenium.webdriver.common.keys import Keys

键盘操作输入快捷键

  • send_keys(Keys.BACK_SPACE):删除键 Del
  • send_keys(Keys.SPACE):空格键 Space
  • send_keys(Keys.TAB):制表键 Tab
  • send_keys(Keys.ESCAPE):回退键
  • send_keys(Keys.ENTER):回车键 Enter
  • send_keys(Keys.CONTROL,‘a’):全选 Crtl+A
  • send_keys(Keys.CONTROL,‘c’):复制 Crtl+C
  • send_keys(Keys.CONTROL,‘x’):剪切 Crtl+X
  • send_keys(Keys.CONTROL,‘v’):粘贴 Crtl+V
  • send_keys(Keys.F1) F1 可选择 F1~F12
练习

需求:
键盘事件案例:
1、百度“seleniumm”
2、BACK_SPACE,删除多输入的m
3、SPACE再输入“空格 教程”
4、ctrl+a,全选文本框内容
5、ctrl+x,剪切选择的内容
6、ctrl+v,粘贴复制的内容
7、ENTER回车代替单击,完成搜索
8、退出浏览器

from  selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

    # 1、百度“seleniumm”
driver.find_element_by_id('kw').send_keys('seleniumm')
    # 2、删除多输入的m
driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE)
time.sleep(2)
    # 3、再输入“空格 教程”
driver.find_element_by_id('kw').send_keys(Keys.SPACE)
driver.find_element_by_id('kw').send_keys("教程")
time.sleep(2)
    # 4、ctrl+a,全选文本框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')
time.sleep(2)
    # 5、ctrl+x,剪切选择的内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')
time.sleep(2)
    # 6、ctrl+v,粘贴复制的内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'v')
time.sleep(2)
    # 7、回车代替单击,完成搜索
driver.find_element_by_id('kw').send_keys(Keys.ENTER)
time.sleep(2)
    # 8、退出浏览器
driver.quit()

警告窗口处理

警告窗口处理概述

警告窗口处理是指
在WebDriver中处理JavaScript所生成的

  • alert
  • confirm
  • prompt

警告窗口处理方法

  • 切换到警告框driver.switch_to.alert()

使用 switch_to.alert()方法定位到alert/confirm/prompt
然后使用

  • driver.switch_to.alert.text 获取警告框的内容
  • driver.switch_to.alert.accept()点击警告框确定按钮
  • driver.switch_to.alert.dismiss()点击警告框取消按钮
  • driver.switch_to.alert.send_keys()往警告框输入内容
练习

需求: 解决警告框的问题
1、百度首页
2、鼠标悬浮到设置按钮
3、点击显示菜单中的搜索设置
4、点击搜索设置中保存设置按钮
5、接收警告框(如何处理警告框)

import time
from  selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

above = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(above).perform()

driver.find_element_by_link_text('搜索设置').click()

time.sleep(5)
#点击保存设置
driver.find_element_by_link_text("保存设置").click()
#弹出警告提示框
time.sleep(5)
aaa = driver.switch_to_alert()
tt=aaa.text
aaa.accept()
time.sleep(5)
print(tt)
#关闭driver对象
driver.quit()

多窗口、多表单处理

在Web应用中经常会遇到frame / iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame / iframe表单内嵌页面上的元素无法直接定位

这是需要通过switch_to.frame()方法将当前定位的主题切换为frame / iframe表单的内嵌页面中。

比如腾讯qq邮箱的用户信息提交模块就是嵌套处理的,如果想要输入用户名、密码信息就要切换表单才可以

切换窗口、表单

  • 切换窗口

    • 获取当前打开窗口的句柄driver.current_window_handle
    • 获取浏览器打开的所以窗口的句柄driver.window_handles
    • 切换窗口driver.switch_to.window(句柄)
  • 切换表单driver.switch_to.frame(表单的属性)

需求: 多表单处理
1、qq首页
2、qq首页点击邮箱连接(窗口的切换)
3、邮箱页面设置用户名及密码(表单的的切换)
4、点击登录按钮

import time
from  selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.qq.com")

#2、qq首页点击邮箱连接(窗口的切换)
driver.find_element_by_link_text('Qmail').click()
handles = driver.window_handles
driver.switch_to_window(handles[1])

# 在新的页面不能操作登录frame里面的元素,需要从当前窗口切换到frame里面去

#3、邮箱页面设置用户名及密码(表单的的切换)
driver.switch_to_frame('login_frame')

driver.find_element_by_xpath('//*[@id="u"]').send_keys('287939828@qq.com')
driver.find_element_by_xpath('//*[@id="p"]').send_keys('123456')
driver.find_element_by_xpath('//*[@id="login_button"]').click()

#关闭driver对象
driver.quit()

设置元素等待

如今很多web都在使用AJAX技术,运用这种技术的软件当浏览器加载页面时,页面上的元素可能不会被同步加载完成,如此一来,定位元素时就会出现困难。
通过设置元素等待来改善这类问题导致的测试脚本不稳定,WebDriver提供里三种元素等待方式:

  • 显示等待
  • 隐式等待
  • 强制等待

注意:等待与休眠不同

隐式等待

原理: 隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,但这个时间不是固定的,并不影响脚本的执行速度,它并不针对页面上的某一元素进行等待,当脚本执行到某个元素位置时,如果可以定位,则直接执行,如果不能定位,则需等待,知道超时抛出异常。

注意: 在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内,不断的刷新页面,去寻找我们需要的元素

方法:

 implicity_wait()
 单位:秒

显示等待

原理: 显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击条件,等不到,就一直等待,除非在规定的时间之内都没找到库,那么就跳出Exception。
简而言之,就是知道元素出现才去操作,如果超时则报异常

方法:

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

强制等待

原理: 也叫线程等待,只固定等待相应的时间。

方法:
import time
Time.sleep()

注意: 若同时设置里隐式等待和显示等待,则以隐式等待为第一优先级,也就是说,若隐式等待时间大于显示等待,则执行显示等待时间;显示等待时间设置无效,因为driver若找不到元素,会先等待隐式等待的时间

练习

需求: 对百度首页的百度一下按钮进行显式等待处理

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

driver.find_element_by_id('kw').send_keys("selenium")

#百度一下按钮进行显式等待处
#presence_of_element_located是指某个元素是否已经被定位(加载上,是否被加载到DOM)
element = WebDriverWait(driver,5,0.1).until(EC.presence_of_element_located((By.ID,'su')),'超时未加载成功')
element.click()

time.sleep(3)
driver.quit()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值