• Selenium元素定位不到?JS注入轻松搞定!


    在使用Selenium做web自动化测试过程中,经常会遇到一些组件无法通过Selenium直接识别和处理,比如<input>标签组合的下拉框,比如日期控件。面对这些元素,我们可以引入JS注入技术来解决问题。

    JavaScript是一种被广泛用于Web前端开发的脚本语言 ,常用来为网页添加动态功能(弹窗,点击事件....)通过HTML DOM,JavaScript提供了页面对象获取和操作功能。

     



    DOM模型把HTML文档解析成一棵树,根节点是<html>,从根节点往下根据节点之间的关系(顺序或包含)把节点解析为兄弟节点和孩子节点。<HTML> 节点有不同的类型:

    元素

    属性

    文本

    Javascript可以根据DOM结构获取任意的HTML元素,变更这些元素的属性,样式,并对元素的鼠标键盘事件做出响应:

    Javascript提供了通过id查找元素的方式:document.getElementById(id);除了id, javascript还支持通过类名和标签名查找元素

    Javascript提供通过innerHTML改变元素内容的方式:document.getElementById(id).innerHTML=new HTML,通过变更节点内部的HTML可以改变元素的文本和行为

    Javascript提供通过attribute改变元素属性的方式:

    document.getElementById(id).attribute=new value

    Selenium支持Javascript

    Selenium WebDriver可以被转换为JavaScriptExecutor,通过JavaScriptExecutor执行Javascript脚本,通过这种方式可以实现Selenium的Javascript注入,从而实现对复杂页面元素的操作。

    WebDriver driver=newChromeDriver();

    JavascriptExecutor js = (JavascriptExecutor) driver;

    js.executeScript("js语句");

    Jquery

    Jquery是一个增强的JavaScript框架,它封装了JavaScript常用的功能代码,简化了HTML文档操作、事件处理、动画设计和Ajax交互。

    对于复杂的网页元素查找,通过Javascript较为低效,此时可以引入Jquery简化元素查找。

    Jquery常见选择器如下,详细语法课参见官网


    Selenium支持Jquery

    Selenium可以通过判定当前待测的网站是否引入Jquery,如果没有则加载Jquery,加载完毕以后即可用Jquery代码来实现前端页面元素的操作。

    publicclass JqueryTest {

    staticJavascriptExecutor js;

    staticWebDriver driver;

    publicstaticvoidmain(String[] args) {

    driver=newChromeDriver();

    js=(JavascriptExecutor)driver;

    driver.get("");

    //判断Jquery是否存在,若不存在则注入

    if(!jqueryLoaded()){

    injectJquery();

    }

    //通过jquery查找出页面百度链接元素个数(.mnav)

    List elements = (List) js

    .executeScript("return jQuery.find('.mnav')");

    driver.quit();

    }

    publicstaticbooleanjqueryLoaded() {

    booleanloaded=false;

    try{

    loaded = (Boolean) js.executeScript("return"+" jQuery()!=null");

    }catch(Exception e){

    System.out.println("查找jQuery对象出现异常");

    }

    System.out.println("页面已存在Jquery对象,无需注入:"+ loaded);

    returnloaded;

    }

    publicstaticvoidinjectJquery() {

    js.executeScript(" var headID = "

    +"document.getElementsByTagName("head")[0];"

    +"var newScript = document.createElement('script');"

    +"newScript.type = 'text/javascript';"

    +"newScript.src = "

    +"'';"

    +"headID.appendChild(newScript);");

    作  者: Testfan kitty

    出  处:微信公众号:自动化软件测试平台

    版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出文章链接

  • 相关阅读:
    docker mariadb5 规格严格
    Cannot negotiate, proposals do not match 规格严格
    Maven 编译时报错 source 1.5 中不支持 multicatch 语句 的解决办法【转载】 规格严格
    本地锁和分布式锁的理解 规格严格
    FastDFS入门 规格严格
    FastDFS入门
    Springboot使用@WebFilterweb过滤器 规格严格
    Maven 编译时报错 source 1.5 中不支持 multicatch 语句 的解决办法 规格严格
    vsftp的简单使用 规格严格
    [python][flask] Flask 入门(以一个博客后台为例)
  • 原文地址:https://www.cnblogs.com/testfan2019/p/12749730.html
Copyright © 2020-2023  润新知