标签:sdi 附加 .com exe string 自动化 xpath定位 ESS col
本篇博文的重点并不是简单的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之那些难以点击到的按钮
标签:sdi 附加 .com exe string 自动化 xpath定位 ESS col
原文地址:https://www.cnblogs.com/davieyang/p/10107772.html