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