• 自动化测试----selenium(二)


    目录

    定位一组元素

    多层框架的定位 

    多层窗口的定位

    层级定位

    下拉框处理

    alert弹框的处理

     div块的处理

     上传文件操作


    定位一组元素

    webdriver 可以很方便的使用findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements 方法。

    应用场景:

    • 批量操作对象,比如将页面上所有的checkbox 都勾上
    • 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个
    1. #coding=utf-8
    2. from selenium import webdriver
    3. import time
    4. import os
    5. dr = webdriver.Chrome()
    6. #打开本地路径 'file:///'+os.path.abspath('文件绝对路径')
    7. file_path = 'file:///' + os.path.abspath('checkbox.html')
    8. dr.get(file_path)
    9. # 选择页面上所有的input,然后从中过滤出所有的checkbox 并勾选之
    10. inputs = dr.find_elements_by_tag_name('input')
    11. for input in inputs:
    12. if input.get_attribute('type') == 'checkbox':
    13. input.click()
    14. time.sleep(2)
    15. dr.quit()
    16. #get_attribute() 获得属性值

    多层框架的定位 

    定位一个框架frame :switch_to.frame(name_or_id_or_frame_element)
    通过frame的id或者name或者frame自带的其它属性来定位框架,这里switch_to.frame()把当前定位的主体切换了frame里。

    switch_to.default_content:从frame中嵌入的页面里跳出,跳回到最外面的默认页面中。

    1. #coding=utf-8
    2. from selenium import webdriver
    3. import time
    4. import os
    5. browser = webdriver.Chrome()
    6. file_path = 'file:///' + os.path.abspath('frame.html')
    7. browser.get(file_path)
    8. browser.implicitly_wait(30)
    9. #先找到到ifrome1(id = f1)
    10. browser.switch_to.frame("f1")
    11. #再找到其下面的ifrome2(id =f2)
    12. browser.switch_to.frame("f2")
    13. #下面就可以正常的操作元素了
    14. browser.find_element_by_id("kw").send_keys("selenium")
    15. browser.find_element_by_id("su").click()
    16. time.sleep(3)
    17. browser.quit()

    多层窗口的定位

    定位一个窗口window:switch_to.window(name_or_id_or_frame_element)
    方法与switch_to.fram()一样

    层级定位

    有时候我们需要定位的元素没有直接在页面展示,而是需要对页面的元素经过一系列操作之后才展示出来,这个时候我们就需要一层层去定位.

    思路:

    先点击显示出1个下拉菜单,然后再定位到该下拉菜单所在的ul,再定位这个ul下的某个具体的link。

    1. #coding=utf-8
    2. from selenium import webdriver
    3. from selenium.webdriver.support.ui import WebDriverWait
    4. import time
    5. import os
    6. dr = webdriver.Chrome()
    7. file_path = 'file:///' + os.path.abspath('level_locate.html')
    8. dr.get(file_path)
    9. #点击Link1链接(弹出下拉列表)
    10. dr.find_element_by_link_text('Link1').click()
    11. #在父亲元件下找到link 为Action 的子元素
    12. menu = dr.find_element_by_id('dropdown1').find_element_by_link_text('Action')
    13. #鼠标定位到子元素上
    14. webdriver.ActionChains(dr).move_to_element(menu).perform()
    15. time.sleep(2)
    16. dr.quit()

    下拉框处理

    下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框对下拉框进行操作后,再定位到下拉框内里的选项。

    1. #coding=utf-8
    2. from selenium import webdriver
    3. import os,time
    4. driver= webdriver.Chrome()
    5. file_path = 'file:///' + os.path.abspath('drop_down.html')
    6. driver.get(file_path)
    7. time.sleep(2)
    8. #先定位到下拉框
    9. m=driver.find_element_by_id("ShippingMethod")
    10. #再点击下拉框下的选项
    11. m.find_element_by_xpath("//option[@value='10.69']").click()
    12. time.sleep(3)
    13. driver.quit()

    alert弹框的处理

    1. # -*- coding: utf-8 -*-
    2. from selenium import webdriver
    3. from time import sleep
    4. import os
    5. dr = webdriver.Chrome()
    6. file_path = 'file:///' + os.path.abspath('alert.html')
    7. dr.get(file_path)
    8. # 点击链接弹出alert
    9. dr.find_element_by_id('tooltip').click()
    10. sleep(2)
    11. #获得弹出框的操作句柄
    12. alert = dr.switch_to.alert()
    13. #关闭alert
    14. alert.accept()
    15. sleep(2)
    16. dr.quit()

    #接受警告信息
    alert = dr.switch_to.alert()
    alert.accept()
    #得到文本信息打印
    alert = dr.switch_to.alert()
    print alert.text
    #取消对话框(如果有的话)
    alert = dr.switch_to.alert()
    alert.dismiss()
    #输入值
    alert = dr.switch_to.alert()
    alert.send_keys("hello word")

     div块的处理

    如果页面元素比较多,利用元素的属性无法准确的定位这个元素的时候,我们可以先定位元素所在的div块,再去定位这个元素。

    1. div1=driver.find_element_by_class_name("midal-body")
    2. div1.find_element_by_link_text("click me").click()
    3. time.sleep(3)

     上传文件操作

    上传文件只要定位上传按钮,通过send_keys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。

    driver.find_element_by_name("file").send_keys("文件绝对路径")

  • 相关阅读:
    AHU 汇编 实验二
    208.实现Trie(前缀树)
    Springboot毕设项目旅游锦囊平台的实现qt05w(java+VUE+Mybatis+Maven+Mysql)
    QFramework引入Utility和System
    【数据结构之B树的讲解】
    [附源码]计算机毕业设计JAVA闲置物品线上交易系统
    java毕业生设计中小型连锁超市配送中心配送管理计算机源码+系统+mysql+调试部署+lw
    Promise面试实战指北
    python小玩意——图片转素描
    学习知识汇总(持续更新......)
  • 原文地址:https://blog.csdn.net/m0_61801103/article/details/125898751