Web自动化测试进阶二

多标签之间的切换

场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。
1)获取所有窗口的句柄
handles = driver.window_handlers
调用该方法会得到一个列表,在selenium运行过程中的每一个窗口都有一个对应的值存放在里面。
2)通过窗口的句柄进入的窗口
driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n])
通过窗口句柄激活进入某一窗口

直接报错,原因是需要句柄

eleDaxing = driver.find_element_by_link_text("大兴")
eleDaxing.click()

使用句柄

driver.get("http://bj.58.com")
print("点击之前句柄:", driver.window_handles)
ele = driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")
ele.click()
list_windowns = driver.window_handles
print("点击之后句柄:", driver.window_handles)
driver.switch_to.window(list_windowns[1])
eleDaxing = driver.find_element_by_link_text("大兴")
eleDaxing.click()
10. 多表单切换
在网页中,表单嵌套是很常见的情况,尤其是在登录的场景
10.1 什么是多表单
实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面
10.2 处理方法
直接使用id值切换进表单
driver.switch_to.frame(value)/driver.switch_to_frame(value)
定位到表单元素,再切换进入
el = driver.find_element_by_xxx(value)
driver.switch_to.frame(el)/driver.switch_to_frame(el)

打开游览器

driver = webdriver.Firefox()

登录QQ

url = "https://qzone.qq.com/"
driver.get(url)

获取元素

定位表单元素

ele_bd = driver.find_element_by_id("login_frame")
driver.switch_to.frame(ele_bd)
ele = driver.find_element_by_xpath(".//*[@id='switcher_plogin']")
ele.click()

输入账号

ele2 = driver.find_element_by_id("u")
ele2.send_keys()

输入密码

ele3 = driver.find_element_by_id("p")
ele3.send_keys("")

ele4 = driver.find_element_by_id("login_button")
ele4.click()
1. 弹出框操作

  1. 进入到弹出框中
    driver.switch_to.alert
  2. 接收警告
    accept()
  3. 解散警告
    dismiss()
    发送文本到警告框
    send_keys(data)
    用法:driver.switch_to.alert.accept()
  • 案例:
    from selenium import webdriver
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    ele_setting = driver.find_element_by_id("s-usersetting-top")
    ele_setting.click()
    ele_gaoji = driver.find_element_by_class_name("setpref")
    ele_gaoji.click()
    ele_save = driver.find_element_by_class_name("prefpanelgo")
    ele_save.click()
    driver.switch_to.alert.accept()
    12.下拉框
    from selenium import webdriver
    import time
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    ele = driver.find_element_by_id("s-usersetting-top")
    ele.click()
    ele1 = driver.find_element_by_xpath(".//[@id='s-user-setting-menu']/div/a[2]")
    ele1.click()
    time.sleep(2)
    ele2 = driver.find_element_by_xpath(".//
    [@id='yadv-setting-gpc']/div/div[1]/i[1]")
    ele2.click()
    list_ele = driver.find_elements_by_class_name("c-select-item")
    print(list_ele)
    list_ele[2].click()

for list_i in list_ele:

print(list_i.text)

if list_i.text =="最近一周":

list_i.click()

13. 鼠标和键盘操作
手动测试时键盘的操作在selenium页有实现,关于鼠标的操作由ActionChains()类来提供,关于键盘的操作由Key()类来提供
1)鼠标操作

  • 导入动作链类,动作链可以储存鼠标的动作,并一起执行
    from selenium.webdriver import ActionChains
    ActionChains(driver)
  • 鼠标右击
    el = driver.find_element_by_xxx(value)
    context_click(el)
    对el执行右击
  • 执行ActionChains中储存的所有动作
    perform()
  • 常用鼠标动作:
    ActionChains(driver).context_click(ele).perform() 点击鼠标右键
    ActionChains(driver). double_click(ele).perform() 点击鼠标左键
    ActionChains(driver).move_to_element(el).perform() 鼠标悬停
  • 案例
    from selenium.webdriver import ActionChains
    from selenium import webdriver
    import time

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
ele = driver.find_element_by_xpath(".//*[@id='s-top-left']/div/a")

ele.click()

ActionChains(driver).double_click(ele).perform()
2)键盘操作
键盘操作使用的是Keys类,一般配合send_keys使用

  • 导入
    from selenium.webdriver.common.keys import Keys
  • 常用键盘操作
    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,‘a’) 全选(Ctrl+A)
    send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
    send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
    send_keys(Keys.F1) 键盘 F1
    send_keys(Keys.F12) 键盘 F12
    14. 浏览器等待
    1) 为什么要进行等待?
    1.网速慢
    2.网站内容过多
    3.如果不进行等待而直接定位元素,可能会抛出异常
    2) selenium中等待的分类:
  1. 显示等待
    显示等待是根据条件进行等待,等待条件出现
    实现:
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
    WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。
  • 案例
    WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(
    (By.CLASS_NAME,"g-hu")))
  • 思考:显示等待与time的区别?
  1. 隐式等待
    隐式等待是根据是件进行等待,等待特定时间
    driver.implicitly_wait(n)
    n的单位为秒,n为最大值,在这个最大值内只要该界面上的全部元素都加载完成定就结束没有加载出元素就抛出 NosuchException.
    注意:优先隐式等待,次之显式等待,最次固定等待
    15. 练习
  2. 使用游览器登录http://www.baidu.com
  3. 搜索淘宝官网
  4. 登录用户名和密码
  5. 搜索商品(手机,电脑,,,,),给定约束条件(价格,包邮,发货地址。。。)
  6. 将商品添加到购物车
  7. 在购物中游览该商品
  8. 根据自己的喜好进行下面的操作
    16. 2.IDE功能简介
  9. 文件:创建、打开和保存测试案例和测试案例集。编辑:复制、粘贴、删除、撤销和选择测试案例中的所有命令。Options : 用于设置seleniunm IDE。
  10. 用来填写被测网站的地址。
  11. 速度控制:控制案例的运行速度。
  12. 运行所有:运行一个测试案例集中的所有案例。
  13. 运行:运行当前选定的测试案例。
  14. 暂停/恢复:暂停和恢复测试案例执行。
  15. 单步:可以运行一个案例中的一行命令。
  16. 录制:点击之后,开始记录你对浏览器的操作。
  17. 案例集列表。
  18. 测试脚本;table标签:用表格形式展现命令及参数。source标签:用原始方式展现,默认是HTML语言格式,也可以用其他语言展示。
  19. 查看脚本运行通过/失败的个数。
  20. 当选中前命令对应参数。
  21. 日志/参考/UI元素/Rollup

-- coding: utf-8 --

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
class Qq(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "https://qzone.qq.com/"
self.verificationErrors = []
self.accept_next_alert = True

def test_qq(self):
    driver = self.driver
    driver.get(self.base_url + "/")
    driver.switch_to.frame(driver.find_element_by_id("login_frame"))
    driver.find_element_by_id("switcher_plogin").click()
    # driver.find_element_by_id("uin_del").click()
    driver.find_element_by_id("u").clear()
    driver.find_element_by_id("u").send_keys("3084761668")
    driver.find_element_by_id("p").clear()
    driver.find_element_by_id("p").send_keys("dafei123457")
    driver.find_element_by_id("login_button").click()
    # ERROR: Caught exception [ERROR: Unsupported command [selectWindow | null | ]]
    # driver.find_element_by_id("tcaptcha_drag_thumb").click()

    # self.assertEqual(driver.title,"QQ空间")
    self.assertIn("QQ11空间",driver.title)
def is_element_present(self, how, what):
    try: self.driver.find_element(by=how, value=what)
    except NoSuchElementException as e: return False
    return True

def is_alert_present(self):
    try: self.driver.switch_to_alert()
    except NoAlertPresentException as e: return False
    return True

def close_alert_and_get_its_text(self):
    try:
        alert = self.driver.switch_to_alert()
        alert_text = alert.text
        if self.accept_next_alert:
            alert.accept()
        else:
            alert.dismiss()
        return alert_text
    finally: self.accept_next_alert = True

def tearDown(self):
    self.driver.quit()
    self.assertEqual([], self.verificationErrors)

if name == "main":
unittest.main()

  1. 百度、QQ空间
  2. 导出
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容