• Selenium自动化测试第二天(上)


    如有任何学习问题,可以添加作者微信:lockingfree

    目录

    框架

    一个框架就是一个独立的网页

    frameset: 框架组,用来布局框架
    frame: 具体的一个框架,一般放在frameset中
    iframe: 内联框架, 可以嵌入到其他网页的body中

    切入 层层切入

    switch_to.frame() # 只用切 iframe/frame 不用切frameset

    1. id
    2. name
    3. index
    4. 定位到的frame元素 find_element_by_id("parent")

    切出

    switch_to.parent_frame() # 跳到上级 多层框架推荐使用
    switch_to.defaut_content() # 跳出所有 一层框架推荐使用 也可以用switch_to.parent_frame()跳出框架

    示例

    from selenium import webdriver
    from time import sleep
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("http://115.28.108.130/control.html")
    
    # iframe: 内联框架, 可以嵌入到其他网页的正文中,
    # frameset: 框架组,用来布局,可以嵌套,不能嵌入到body中,
    # frame,框架,需要放到frameset中
    # 只用切iframe及frame, frameset是用来布局的,不用切
    driver.switch_to.frame("parent_frame")
    driver.switch_to.frame("left")
    driver.find_element_by_link_text("链接1").click()
    
    driver.switch_to.parent_frame()  # 这里不用swith_to.default_content(),不然还要再切到parent_frame
    driver.switch_to.frame("main")
    print(driver.find_element_by_tag_name("h2").text)
    # print(driver.find_element_by_xpath("/html/body/h2").text)
    
    sleep(5)
    driver.quit()
    

    练习

    打开 http://115.28.108.130/control.html,点击链接1,输出右侧文本内容

    注意

    1. 框架中的页面 尽量不要使用xpath绝对路径定位 /html/body/h2

    xpath

    1. 绝对路径+索引 /html/body/div/form/div[3] 逐层写 结合index index从1开始
    2. 相对路径+属性(推荐) //div[@id="firstdiv"] 支持多属性结合定位
    3. 通过子标签 //div[a] 包含链接的div
    4. 通过文本定位 //[text()="第二个div"] 包含 //[contains(text(), "username")]
    5. 通过相对位置 //*[text()="第二个div"]/../table
    6. 轴 //[text()="王五"]/following::a following后面的
      //
      [text()="用户名"]/following::input 用户名后的第一个输入框

    也可以通过F12复制(不推荐:有可能有问题)

    注意:

    1. xpath的索引从1开始
    2. 使用文本定位 注意 换行 空格  特殊字符
    3. 注意动态位置,动态属性
    4. 注意复制的xpath可能会有问题

    css selector

    css选择器, 比xpath快
    find_element_by_css_selector("#firstdiv")

    基本

    1. id #firstdiv
    2. class .stuname
    3. 标签名 div *可以标识任意标签

    位置 不支持向上

    1. 下级 #firstdiv>form>div >或空格
      • 同级元素
    2. 索引: :first-child() :nth-child(n) #firstdiv>form>div:nth-child(3)

    属性 不支持判断文本

    1. 属性 [type="password"] [name=""]
    2. 属性 ^= 以 开头 $= 以 结尾 *= 包含
    3. input 常见属性: checked enabled

    示例

    from selenium import webdriver
    from time import sleep
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("http://115.28.108.130/control.html")
    
    div = driver.find_element_by_css_selector("#firstdiv>form>div:nth-child(2)")
    print(div.text)
    table = driver.find_element_by_css_selector("#firstdiv>form>div+table")
    print(table.tag_name)
    

    练习:

    打开 http://115.28.108.130/control.html#

    1. 找到"第二个div"并打印文本 text
    2. 找到"第二个div"同级的table并打印标签名 tag_name

    注意:

    1. css selector不支持往上级查找
    2. 不支持查找包含某个子标签的标签
    3. 不支持查找指定文本内容的标签

    切换窗口

    1. switch_to.alert(): 切到弹出框
    2. switch_to.frame(): 切入框架
    3. switch_to.window(): 切换窗口
    • window_handles: 所有窗口句柄 列表
    • current_window_handle: 当前窗口句柄

    只有两个窗口

    all = driver.window_handles  # 所有窗口句柄
    old = driver.current_window_handle  # 当前窗口出版
    
    for h in all:  # h 是当前从all中取出来的句柄
        if h != old:  # 如果取出来的不等于老窗口
            driver.switch_to.window(h)   # 切换到新窗口
    

    多个窗口

    all = driver.window_handles
    for h in all:
        driver.switch_to.window(h)
        if "腾讯课堂" in driver.title:
            break  # 跳出循环
    

    示例

    from selenium import webdriver
    from time import sleep
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("http://115.28.108.130/control.html")
    
    
    # 1. 切到新页面(只打开了两个页面)
    driver.find_element_by_partial_link_text("在新页面").click()
    print(driver.title)  # 还在原页面
    all = driver.window_handles
    old = driver.current_window_handle
    for h in all:
        if h!=old:
            driver.switch_to.window(h)
    print(driver.title) # 切换到了新页面
    driver.find_element_by_id("kw").send_keys("龙腾育才")
    driver.find_element_by_id("su").click()
    sleep(1)
    driver.find_element_by_partial_link_text("腾讯课堂").click()  # 又打开了新页面
    
    # 2. 多窗口切换, 根据网页标题切换
    print(driver.title)  # 还在百度搜索页上
    
    all = driver.window_handles
    for h in all:
        driver.switch_to.window(h)
        if "腾讯课堂" in driver.title:
            break
    else:
        print("没有找到相应的页面")
    
    print(driver.title)
    
    sleep(5)
    driver.quit()
    

    练习

    打开百度 http://www.baidu.com
    搜索赶集网
    切换到赶集网,并打印标题

    此为北京龙腾育才 Python高级自动化(Selenium部分)授课笔记
    课程介绍
    想要参加现场(北京)/网络课程的可以联系作者微信:lockingfree

    1. 高效学习,快速掌握Python自动化所有领域技能
    2. 同步快速解决各种问题
    3. 配套实战项目练习
  • 相关阅读:
    clear session on close of browser jsp
    [SQL Server]从 varchar 数据类型到 datetime 数据类型的转换产生一个超出范围的值。
    Windows Server 2012上安装.NET Framework 3.5
    SqlServer安装时的选项说明
    js 动态控制 input 框 的只读属性
    svn备份与还原_脚本_(dump命令)
    几种任务调度的 Java 实现方法与比较
    在WordPress正文顶端或者末尾插入固定的内容
    TODO
    fileUpload(草稿)
  • 原文地址:https://www.cnblogs.com/superhin/p/10314638.html
Copyright © 2020-2023  润新知