问题场景

在自动化测试过程中,selenium api用的最多的就是点击,任何页面验证逻辑都有可能用上click方法去点击元素,何曾想过,这么重要的操作会在自动化执行过程中失效。很可怕,平常执行的case很正常,偶尔给你报个错,当然这个错不是点击直接造成的,而是点击没有真正点击元素,导致的下一步验证或操作无效,报错异常。通过报错的截图发现并不是有业务问题,而是自动化用例自生的问题。

selenium有几种操作元素点击事件的方法

我用的java版本的,因为是自动化平台,所以没有用python,当然python也好用,也在用

  1. 原滋原味的api方法WebElement.click()
  2. 有那么点陌生的api方法 new Actions(driver).moveToElement(el).click().build().perform()
  3. 第三就是用的比较少的"document.querySelector("#el_id").click()"
  • 具体代码如下
WebDriver driver = autoDriverAtion.getWebDriver();
WebElement el = autoDriverAtion.getWebElement();

// 1. 默认selenium api的方法
autoDriverAtion.getWebElement().click();

// 2. 使用增强版的Actions
Actions action = new Actions(new Augmenter().augment(driver));
action.moveToElement(el,5,5).click().build().perform();

//3. 使用普通版的Actions
Actions aciton = new Actions(driver);
aciton.moveToElement(el,5,5).click().build().perform();

//4. 使用js方法来实现这个问题
String js = "document.querySelector(\'"+autoDriverAtion.getBy()+"\').click()";
JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("arguments[0].click();", el);

三者有什么区别?

其实对于点击本身来说,就是谁去操作着点击动作,这个可以理解为:第一种方式是元素自身的click事件触发,这里需要元素自身支持点击(元素点击事件可以被自定义,用其他的事件代替,比如zepto来修改监听,然后触发事件内容),这个有时会报出不可交互不可点击的错误;第二个是由鼠标点击,一般不会报错;第三个也是元素本身的点击,只不过通过js实现,要知道se是通过http请求将命令传递远程server,然后通过driver传给浏览器执行,js这个是将完整的任务给传到浏览器中,是最有效的,一般也不会报错,除非主动添加断言。

想一想好像不会很大的区别?需要了解下,remoteWebdriver的工作方式:脚本方法->se-alone-server->chromeDriver->chrome,这个过程会因为网络或者执行的case过多导致命令失效,这个概率很低,但还是会有,因为我遇到了,通过官方issues看到,没有有效的解决方案,而是希望chromedriver会有什么改动来优化这个问题,我也试过那些方案,也不是很好,很纠结,本文主要为有同样问题的同学,提供解决问题的思考点。

最后

这个问题,希望能在后面se或者chromedriver版本汇总得到优化。在自动化平台中,使用的是第二个和第三个方法来解决点击事件,这样交错着用,能解决一些问题,目前来看,还是有效的。(后面有好的方案再更新 - 20191130 北京 雪)