Java&Selenium&JS&AWT之那些难以点击到的按钮

Posted davieyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java&Selenium&JS&AWT之那些难以点击到的按钮相关的知识,希望对你有一定的参考价值。

一、摘要

本篇博文的重点并不是简单的click()方法,而是要讲的是那些click()方法失效的时候的处理方式,其实做自动化久了我们都能发现研发的代码并不是都那么美丽,selenium支持的8种定位方式也大多形同摆设,而测试往往处于弱势,即便是自动化工程师你也不敢跟研发说你的空间没有id,因为弱势无法挑战,从多年的管理角度说合理的pk和挑战是良药,废话不多说故事也不多讲看内容吧

二、页面

技术分享图片

这是我实际工作中的一个弹出,简单说一下它到底是个什么东西,在这里它没有iframe、不是alert、不是prompt,什么都不是,它只是一层一层的html代码

虽然能看懂前端代码但我确实不知道为什么

三、点击“确定”按钮

 方法一:我们第一个想到的一定是selenium提供的click()方法

driver.findElement(By.xpath(".....")).click();

那么这个页面就让你失望了,并没什么稀奇古怪的东西,但是就是点不了

方法二:那么我们一定是要点了它才能完成测试用例的执行,第一种方式不行,还有什么其他方法呢,我去手动测试这个按钮,是否接受键盘的Enter键,果然响应了Enter键

于是立刻用selenium提供的方法代码实现

driver.findElement(By.xpath("...")).sendKeys(Keys.ENTER);

可惜的是又失望了,还是不能生效,导致测试用例执行失败

方法三:于是封装了敲击键盘的方法,尝试不用Selenium提供的方法,实现敲击Enter键

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
public class KeyBoardUtil {
 /**Enter键封装*/
    public static void pressEnterKey(){
        Robot robot = null;
        try{
            robot = new Robot();
        }catch (AWTException e){
            e.printStackTrace();
        }
        //调用keypress方法来实现按下Enter键
        assert robot != null;
        robot.keyPress(KeyEvent.VK_ENTER);
        //调用keyrelease方法来实现释放Enter键
        robot.keyRelease(KeyEvent.VK_ENTER);
    }
}

幸运的是这个方法生效了,于是在我的代码里直接调用了这个静态方法pressEnterKey(), 解决了这个问题

方法四:如果还是不能解决问题,就要使用第四种方式了,JS完成单击操作

    /**
     *
     * @param driver 浏览器驱动
     * @param xpath xpath定位表达式
     */
    public static void javascriptClick(WebDriver driver, String xpath) {
        WebElement element = driver.findElement(By.xpath(xpath));
        try{
            if(element.isEnabled() && element.isDisplayed()){
                System.out.println("使用JS进行也面元素单击");
                //执行JS语句arguments[0].click();
                ((JavascriptExecutor) driver).executeScript("arguments[0].click();", element);
            }else {
                System.out.println("页面上元素无法进行单击操作");
            }
        }catch (StaleElementReferenceException e){
            System.out.println("页面元素没有附加在页面中" + Arrays.toString(e.getStackTrace()));
        }catch (NoSuchElementException e){
            System.out.println("在页面中没有找到要操作的元素" + Arrays.toString(e.getStackTrace()));
        }catch (Exception e){
            System.out.println("无法完成单击操作" + Arrays.toString(e.getStackTrace()));
        }
    }

 





以上是关于Java&Selenium&JS&AWT之那些难以点击到的按钮的主要内容,如果未能解决你的问题,请参考以下文章

[Selenium+Java] Selenium with HTMLUnit Driver & PhantomJS

[Selenium+Java] How to use IntelliJ IDEA & Selenium Webdriver

[Selenium+Java] Implicit Wait & Explicit Wait in Selenium

使用 Java 和 Selenium WebDriver 在表单和 iframe 中查找元素

[Selenium+Java] Parallel Execution & Session Handling in Selenium

Java&Selenium&TestNG&ZTestReport 自动化测试并生成HTML自动化测试报告