Selenium系列:解决文本框联想内容自动输入

发表于:2021-6-04 09:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:掘金

  背景:在完成UI自动化过程中,会遇到文本框,在输入内容后,会出现联想选项,有些类似下拉框但又不同于下拉框的操作,例如携程:
  如上,想从联想的内容中选择某一项输入,该如何实现?
  好,明白了,超级厉害,马上F12一开,右键定位页面元素,你会发现,这个联想框是会消失的,根本不可定位;愁煞人也。
  @Test(enabled = true)
    void test_text_autoComplate() throws InterruptedException {
      driver.get("https://www.ctrip.com");
      String partialText = "北京";
      String actulText = "北京西站,北京";
      // 联想是出来了,但是这个示例的联想框无法通过F12右键定位元素,所幸既然知道目标输入值,就直接键入即可
      driver.findElement(By.id("HD_CityName")).sendKeys(partialText);
      WebElement element = driver.findElement(By.xpath("//div[starts-with(@id,'address_filterContainer_uid_')]"));
    // 当你找到下一步,就有点跟从下来选项一样的操作,从element中找一个列表集合,但是你发现却无法定位
    // 因为不是select标签下的option子元素,再者即使是上面的xpath还是自己手写抄下来的,div标签下的子集根本无从知晓。
  在解决上面的问题之前,先来看另一个例子或者百度输入框的联想输入框也是可定位元素的:
  分析:通过F12调试模式,可以定位到文本框标签,联想出来的元素都能通过元素定位找到,点击Consle,输入:document.getElementById("aria-option-3")
  这些元素都是可以通过Element栏找到的,那么需要选择联想内容的某一项,测试代码如下:
  /**
  * @BeforeClass
  *  创建driver对象
  */
    @Test(enabled = false, description = "联想选择内容输入文本框")
    public void test1() throws Exception {
      driver.get(cont.expUrl);
      String partialText = "北京";
      // 输入一部分内容,会联想出其他选择项
      driver.findElement(By.id("hotel-destination-hp-hotel")).sendKeys(
          partialText);
      // 找到联想框的元素
      WebElement ele = driver.findElement(By.id("typeaheadDataPlain"));
      // 获取联想框标签下的元素
      List<WebElement> eles = ele.findElements(By.tagName("li"));
      // 遍历输出
      for (int i = 0; i < eles.size(); i++) {
        System.out.println("联想选择项:" + eles.get(i).getText());
      }
      Thread.sleep(2000);
      // 根据索引来选择文本内容输出即可
      for (WebElement el : eles) {
        if (el.getText().equals(eles.get(eles.size() - 2).getText())) {
          el.click();
          Thread.sleep(2000);
          break;
        }
      }
    }
    /**
    *@AfterClass
    * 完成测试,退出
    */
  这个网址的联想操作,与携程的联想操作,应该要是一样的,难点:在于找到输入框之下的标签元素。我还没右键查找,它就消失了,还怎么知道子标签是啥?
  方法有二:
  其一,当然不是百度,而是问开发啊,测试自己公司的产品,不问开发问百度,哪个有效率还用教你吗?
  其二,当然是自己挑战难度,毕竟解决这类问题更令人振奋嘛;这种稍纵即逝的机会如何把握呢?后台开发可以debug,难道前端开发就不debug了吗?F12也自带debug功能,打断点操作如下:
  哦豁,那么回到开局的一张图,选择subtree modifications子节点debug调试,这样就能知道div下有什么元素了,让后通过找元素的方法定位它。
  测试代码如下:
  /**
     * 实际演示的是携程网,输入目的地联想的文本,选择输入, 但是在F12或其他浏览器查找元素的时候,这个框一闪即逝,
     * 解决方法:F12设置前后断点,单步调试即可让这个元素显示不消失。
     * 
     * @throws InterruptedException
     */
    @Test(enabled = true)
    void test_text_autoComplate() throws InterruptedException {
      driver.get("https://www.ctrip.com");
      String partialText = "北京";
      String actulText = "北京西站,北京";
      // 联想是出来了,但是这个示例的联想框无法通过F12右键定位元素,所幸既然知道目标输入值,就直接键入即可
      driver.findElement(By.id("HD_CityName")).sendKeys(partialText);
      WebElement element = driver
          .findElement(By
              .xpath("//div[starts-with(@id,'address_filterContainer_uid_')]"));
      // 判断是否元素是否显示
      if (element.isDisplayed()) {
        List<WebElement> elements = element.findElements(By
            .cssSelector("div.sug_item>a>span.city"));
        // for (int i = 0; i < elements.size(); i++) {
        // System.out.println(elements.get(i).getText());
        // }
     
        // 两个if条件选一个测试即可,两种场景实现联想内容的输入框测试
        for (WebElement ele : elements) {
          // 这个是目标值来判断:获取元素的text与目标输入文本保持一致
          if (actulText.equals(ele.getText())) {
            System.out.println("结果选择正确");
            ele.click();
            Thread.sleep(5000);
            break;
          }
          // 这是根据索引随机选择一项文本进行点击
          if (ele.getText().equals(
              elements.get(elements.size() - 2).getText())) {
            System.out.println("结果选择shi :" + ele.getText());
            ele.click();
            Thread.sleep(5000);
            break;
          }
        }
      }
    }
  唉、这算是复习了,之前没好好记录解决这类问题的方法,现在又需要重新学习来完成它,虽然花了很多时间,但是值得的!缺点:耗时,优点:提升解决问题的思维。愿君共勉!

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号