zoukankan      html  css  js  c++  java
  • selenium 学习记录01

    自动化测试记录

    隐式等待

    wb.implicitly_wait(5)
    
    implicitly_wait(xx),隐性等待的意义是:闪电侠和凹凸曼约定好,不论闪电侠去哪儿,都要等凹凸曼xx秒,如果凹凸曼在这段时间内来了,则俩人立即出发去打怪兽,如果凹凸曼在规定时间内没到,则闪电侠自己去,那自然就等着凹凸曼给你抛异常吧。
    
    

    强制等待

    # -*- coding: utf-8 -*-
    from selenium import webdriver
    from time import sleep
    driver = webdriver.Firefox()
    driver.get('https://huilansame.github.io')
    sleep(3) # 强制等待3秒再执行下一步
    print driver.current_url
    driver.quit()
    
    最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间。
    
    这种叫强制等待,不管你浏览器是否加载完了,程序都得等待3秒,3秒一到,继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样等待,不过不建议总用这种等待方式,太死板,严重影响程序执行速度。
    
    

    切换iframe窗口

    wb.switch_to.frame('iframe1')   # 切换窗口
    
    # wd.switch_to.frame(frame_reference)
    # 其中, frame_reference 可以是 frame 元素的属性 name 或者 ID 。
    # 比如这里,就可以填写 iframe元素的id ‘frame1’ 或者 name属性值 ‘innerFrame’。
    

    handle 句柄

    selenium遇到无法定位元素解决方法,首先判定是不是alert,再判定是不是iframe,如果都不能解决就使用selenium的handle处理方式再进行定位操作:
    
    # 打印全部的handle
    
    
    all_handle = driver.window_handles
    
    #打印当前的handle
    
    
    handle = driver.current_window_handle
    # 切换到新的handle上
    
    
    driver.switch_to.window(handle)
    
    
    

    selenium中的三大切换(handle窗口、iframe切换、alert弹框)

    handle窗口切换

    一、handle窗口切换
    
    当点击某个元素后,会重新生成一个新的页签,但此时我们的操作仍然在原先的窗口当中,如果要在新的窗口继续操作元素,那么就要用到handle窗口切换的方法。
    
    常用方法:
    
    window_handles:获取当前打开的所有窗口句柄,返回类型为一个列表。
    
    current_window_handle:获取当前窗口的句柄。
    
    switch_to.window(handle_path):切换窗口,handle_path参数代表的是一个窗口句柄。
    
    当操作某个元素后需要等待新的元素出现,我们用到了显性等待,EC给了我们一个方法为visibility_of_element_located(),表示元素可见,那么在handle窗口切换时也涉及到等待,那就是等待新的窗口打开,我将用一般方法和新的方法来展示,具体用法如下:
    
    (使用time.sleep()强制等待):
    
    import time
    
    from selenium import webdriver
    
    from selenium.webdriver.support.wait import WebDriverWait
    
    from selenium.webdriver.support import expected_conditions as EC
    
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    
    driver.get("http://www.baidu.com")
    
    driver.maximize_window()
    
    driver.find_element_by_id("kw").send_keys("python")
    
    driver.find_element_by_id("su").click()
    
    loc = (By.XPATH, "//a[text()=' 基础教程 | 菜鸟教程']")
    
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
    
    driver.find_element(*loc).click() # 点击后新的窗口出现
    
    # 切换到新的窗口,在新窗口去操作元素
    
    time.sleep(1) # 强制等待1秒
    
    # 1、获取当前打开的所有窗口。--- 窗口列表。handles
    
    wins = driver.window_handles
    
    print(wins)
    
    # 打印打前窗口的句柄
    
    print(driver.current_window_handle)
    
    # 2、切换的语句 ,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]
    
    driver.switch_to.window(wins[-1])
    
    # 3、在新的页面当中,找元素,并操作
    
    loc = (By.XPATH, "//ul[@class='pc-nav']//a[text()='首页']")
    
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
    
    driver.find_element(*loc).click()
    
     
    
    
    

    iframe 切换

    img

    二、iframe切换
    
    iframe表示在主html上嵌入的子html页面如下图所示:
    
    
    当我们要在新的html页面操作元素,就要切换到新的html页面后才能进行接下来的操作,常用方法如下:
    
    switch_to.frame(path):切换到新的html页面,path支持下标、name、WebElement对象三种参数
    
    switch_to.default_content():切换到主html页面
    
    switch_to.parent_frame():切换到上一层html页面(父页面)
    
    在iframe切换中也有等待,除了使用time.sleep()方法外,EC给了我们一个方法为frame_to_be_available_and_switch_to_it(),表示iframe有效并切换到iframe当中,它支持下标、name、WebElement对象以及元组四种方法传参。
    
     
    
    
    

    alert弹窗切换

    三、alert弹框切换
    
    如何区分是alert弹框呢?一个简单的方法就是无法使用元素定位的弹框,并且需要优先处理后才能操作后面的元素,常用方法如下:
    
    switch_to.alert:切换到alert弹框
    
    accept():确定
    
    dismiss():取消
    
    send_keys(keysToSend) :输入文本,keysToSend表示输入的文本内容字符串
    
    text():获取弹出框里面的内容
    
    在EC里面也给alert弹框设定了一个方法,alert_is_present()方法表示等待alert弹框出现并切换到alert弹框中
    
    方法一(常规做法):
    
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    
    driver.maximize_window()
    
    driver.get("http://XXXX")
    
    # 做一个操作,导致alert框出现
    
    driver.find_element_by_id("idxxx").click()
    
    # 切换到alert弹框
    
    alert = driver.switch_to.alert
    
    # 获取alert的文本内容
    
    print(alert.text)
    
    # 点击确定,关闭弹框
    
    alert.accept()
    
    方法二(使用骚操作EC.alert_is_present()方法):
    
    from selenium import webdriver
    
    from selenium.webdriver.support.wait import WebDriverWait
    
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    
    driver.maximize_window()
    
    driver.get("http://XXXX")
    
    # 做一个操作,导致alert框出现
    
    driver.find_element_by_id("idxxx").click()
    
    # EC条件 -- 等待alert弹框出现,并切换到alert当中
    
    alert = WebDriverWait(driver, 10).until(EC.alert_is_present())
    
    # 获取alert的文本内容
    
    print(alert.text)
    
    # 点击确定,关闭弹框
    
    alert.accept()
    
  • 相关阅读:
    魔镜完全是被王后问烦了才给她找点事做不再来烦它吧(豆瓣的经典评论)
    调色板QPalette类用法详解(附实例、源码)
    当程序调用dll时获取dll路径,DLL中获取自身的句柄
    把硬盘格式化成ext格式的cpu占用率就下来了
    Delphi XE6 如何设计并使用FireMonkeyStyle
    系统重构
    阅读Google的C++代码规范有感
    VS2010生成安装包制作步骤
    MVC视图中的@Html.xxx(...)
    高性能的JavaScript--加载和执行
  • 原文地址:https://www.cnblogs.com/chenfei2928/p/12705576.html
Copyright © 2011-2022 走看看