zoukankan      html  css  js  c++  java
  • Selenium自动化测试第二天(下)

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

    目录

    动作链 模拟鼠标操作

    • click(): 单击
    • double_click(): 双击
    • context_click(): 右击
    • move_to_element(a): 移动到元素a
    • drag_and_drop(a,b): 拖放,将a拖动到b元素位置
    • click_and_hold(): 单击并按住鼠标左键 release(): 松开鼠标
    from selenium.webdriver.common.action_chains import ActionChains
    ...
    menu = driver.find_element_by_xpath("//input[@value='下拉菜单']")
    ActionChains(driver).move_to_element(menu).perform()
    

    示例

    from selenium import webdriver
    from time import sleep
    from selenium.webdriver.common.action_chains import ActionChains
    
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("http://115.28.108.130/control.html")
    sleep(1)
    # driver.find_element_by_link_text("baidu").click()   # 找不到该元素
    dropdown = driver.find_element_by_xpath("//input[@value='下拉菜单']")
    
    ActionChains(driver).move_to_element(dropdown).perform()  # 记得使用perform()执行
    
    driver.find_element_by_link_text("baidu").click()
    
    
    sleep(5)
    driver.quit()
    

    练习

    打开百度->设置->高级搜索->输入龙腾育才->搜索

    注意

    1. 不要忘记使用perform()执行操作

    Keys模拟键盘

    keys

    from selenium.webdriver.common.keys import Keys
    ....
    input = driver.find_element_by_id("kw")
    input.send_keys("龙腾育才")
    input.send_keys(Keys.ENTER)
    

    示例

    from selenium import webdriver
    from time import sleep
    from selenium.webdriver.common.keys import Keys
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("http://www.baidu.com")
    input = driver.find_element_by_id("kw") 
     # 注意不要使用 input = driver.find_element_by_id("kw").send_keys("龙腾育才")
    input.send_keys("龙腾育才")
    input.send_keys(Keys.ENTER)
    
    sleep(5)
    driver.quit()
    

    练习

    打开百度

    1. 输入龙腾育才
    2. 退格2次
    3. 全选 复制 粘贴

    截图

    一般用例出错或失败时要截图

    1. save_snapshot(path) get_snapshot_as_file(path) # path是保存的图片路径

    示例

    from selenium import webdriver
    from time import sleep
    
    
    driver = webdriver.Chrome()
    driver.set_window_size(800,600)
    driver.get("http://www.baidu.com")
    driver.save_screenshot("d:/1.png")   # 只支持png格式 等同于 driver.get_screenshot_as_file("d:/2.png")
    
    sleep(5)
    driver.quit()
    

    注意

    1. 只支持png格式

    等待

    1. 强制等待 time.sleep(5)
    2. 隐性等待(智能等待) driver.implicitly_wait(10) 10s超时 所有元素定位不到都会等待
    3. 显性等待(高级用法)
      wait = WebDriverWait(driver,20)
      wait.until(lambda driver: driver.find_element_by_id("...").click())
      每隔一定时间查找并单击元素,直到找到

    使用定位器定位

    find_element(*location) By.ID, "kw"

    from selenium.webdriver.common.by import By
    find_element(By.ID, "")   find_element_by_id("")
    find_element(By.NAME, "")  find_element_by_name("")
    find_element(By.CLASS_NAME, "")  find_element_by_class_name("")
    find_element(By.LINK_TEXT, "")  find_element_by_link_text("")
    find_element(By.PARTIAL_LINK_TEXT, "")  find_element_by_partial_link_text("")
    find_element(By.PATH, "")  find_element_by_partial_xpath("")
    find_element(By.PARTIAL_CSS_SELECTOR, "")  find_element_by_css_selector("")
    
    • ID = "id"
    • XPATH = "xpath"
    • LINK_TEXT = "link text"
    • PARTIAL_LINK_TEXT = "partial link text"
    • NAME = "name"
    • TAG_NAME = "tag name"
    • CLASS_NAME = "class name"
    • CSS_SELECTOR = "css selector"

    使用期望条件(except_conditions)

    • presence_of_element_located((By.XPATH,"")): 直到元素出现并能定位到
    view = wait.until(EC.presence_of_element_located((By.XPATH,'//td[text()="王五"]/../td[4]/a')))
    view.click()
    

    示例

    from selenium import webdriver
    from time import sleep
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("http://115.28.108.130/control.html")
    # driver.implicitly_wait(10)
    
    wait = WebDriverWait(driver, 20)
    
    # 等待元素出现并操作元素
    # wait.until(lambda driver: driver.find_element(By.XPATH, '//*[text()="王五"]/following::td[3]/a').click())
    
    # 相当于 等待出现 再 操作元素  注意 presence_of_element_located((By.ID, ""))  里面传一个元祖参数
    lookup = wait.until(EC.presence_of_element_located((By.XPATH, '//*[text()="王五"]/following::td[3]/a')))
    lookup.click()
    
    sleep(5)
    driver.quit()
    

    开挂的js

    使用js可以修改网页

    1. 隐藏元素
      selenium默认定位不到隐藏元素
    selenium.common.exceptions.ElementNotVisibleException: 
    Message: element not visible
    

    hide
    hidden
    hidden="hidden"
    style="display: none"
    1. 按手工逻辑操作使其显示再定位
    2. 使用js强制改成显示再定位

    # 移除相应属性
    driver.execute_script(
        document.querySelector("#hd1").removeAttribute("hidden");
    )
    
    1. 不可输入/点击(移除readonly/disable属性)
    2. 拖动滚动条(流加载页面) document.documentElement.scrollTop=10000;
    3. 富文本框
    4. 更改元素样式
    js2 = '''
    var q = document.getElementById("buttonID");
    q.value="hello";
    q.style.backgroundColor="red";
    '''
    driver.execute_script(js2)
    
    1. 为一些不好定位的元素添加id
    js4='''
    '''
        q = document.querySelector("#firstdiv>form>table");
        q.id = "table1";
    

    示例

    from selenium import webdriver
    from time import sleep
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("http://115.28.108.130/control.html")
    
    
    # # 1. 滚动页面  document.documentElement.scrollTop=1000
    # # driver.find_element_by_link_text("友情链接").click()   # 不需要滚动页面页可以定位到下面的元素(只要加载了)
    # # driver.back()
    # js = 'document.documentElement.scrollTop=1000;'   # DTD网页 否则使用docment.body.scrollTop=1000; 滚动到居上1000像素处
    # driver.execute_script(js)  # 可用于处理流页面
    #
    # sleep(3)
    # # 2. 更改元素样式 使用 document.getElementById() 得到DOM对象
    # js = '''
    # document.documentElement.scrollTop=0;
    # var q = document.getElementById("buttonID");
    # q.style.backgroundColor="red";
    #
    # '''
    # driver.execute_script(js)
    #
    # sleep(3)
    # # 3. 移除readonly/disable/hidden/属性  使用jquery定位  $(#id)  和getElementById("")得到的DOM对象不同 两者拥有不同的方法
    # js = "document.querySelector('#ro').removeAttribute('readonly')"
    # # js = "$('#ro').removeAttribute('readonly')"
    # driver.execute_script(js)
    # ro = driver.find_element_by_id("ro")
    # ro.clear()
    # ro.send_keys("成功输入")
    #
    # # 或直接使用js修改value
    # js = 'document.querySelector("#ro").value="成功输入"'
    # driver.execute_script(js)
    
    
    # 4. 富文本框输入
    
    driver.get("http://www.vemmis.com/bjq/index.html")
    
    # js操作iframe 先获取iframe里面的window对象,再通过这个对象,获取到里面的DOM元素
    js = '''
    iframe = document.getElementById('ueditor_0');
    iframe.contentWindow.document.body.innerHTML="hello";
    '''
    driver.execute_script(js)
    
    sleep(5)
    driver.quit()
    

    练习

    打开http://115.28.108.130/control.html

    1. 在"哈哈你输入不了"的输入框清空并输入"js开挂" (移除readonly属性)
    2. 点击"不可点击"按钮(移除disable属性)
    3. 为"第一个div"同级的table标签添加id="table1"

    日期控件

    1.逐个点击
    2.用js修改为可输入,输入时间

    练习

    http://115.28.108.130/date.html
    修改为可输入,并输入时间

    上传下载

    1. 上传直接输入(不能输入用js修改), 下载直接点击
    2. 借助其他工具

    练习

    打开http://115.28.108.130/control.html, 上传文件

    selenium宇宙之外

    比如弹出上传下载windows对话框, flash操作, 保存网页

    1. 使用Autoit3/按键精灵编写脚本->生成exe->python执行exe
    2. 使用win32/win32gui操作windows窗口

    常见错误怎么处理

    1. 看报什么错 1. 元素定位不到 2. 元素不可见
    2. 看有没有frame/iframe
    3. 操作前 sleep()
    4. 看看元素或者上级/上上级元素是否不可及

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

    1. 高效学习,快速掌握Python自动化所有领域技能
    2. 同步快速解决各种问题
    3. 配套实战项目练习
  • 相关阅读:
    如何修改 gitlab 的项目名称
    Vue 项目中 webSocket 的使用(服务端是 Java Spring boot)
    如何能选到好的车牌号
    实现微信,浏览器,App中H5的路线规划
    H5 navigator.geolocation demo
    npm package.json 中版本指定符号: ~ 、^、*
    小程序中静态资源绝对路径的写法
    重置gvim8 ctrl+f的翻页功能
    [TS]Map的基本操作
    [TS]闭包测试
  • 原文地址:https://www.cnblogs.com/superhin/p/10314641.html
Copyright © 2011-2022 走看看