【问题标题】:How to loop on the if statement if it is a WebElement?如果它是 WebElement,如何循环 if 语句?
【发布时间】:2015-07-06 10:10:01
【问题描述】:

我正在尝试操纵这些代码块:

List<WebElement> more = driver.findElements(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[4]/button"));
        if(more.size()!=0){
                driver.findElement(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[4]/button")).click();
        }else {
            WebElement present = driver.findElement(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[3]/div/table/tbody"));
            List<WebElement> list = present.findElements(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[3]/div/table/tbody/tr"));
            System.out.println("Total Number of TR: " + list.size());
        }
    

我希望做的是,在执行 IF 语句中的内容之前,我想在每次看到元素 /html/body/div[1]/div/div[ 3]/div/div/div[1]/div/div[2]/div[2]/div/div[4]/button 会被点击,如果不可用然后我会执行这个:

WebElement present = driver.findElement(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[3]/div/table/tbody"));
            List<WebElement> list = present.findElements(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[3]/div/table/tbody/tr"));
            System.out.println("Total Number of TR: " + list.size());

有关更多信息,我想在这里做的是。 我在一个特定模块的列表视图上,然后在按钮上有一个“单击此处获取更多记录”->它的 XPath 是 /html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[4]/button 我希望如果我在列表视图中并且如上所述存在该按钮 - 我想单击它。如果在列表视图中没有“点击这里查看更多记录”按钮(例如记录仅由5条记录组成,因此没有明显的分页)我想执行一段代码。

【问题讨论】:

  • 我不确定我是否正确理解了你的问题,这就是为什么我没有写这个作为答案。但也许您可以编写if(more.size()==0){,后跟您当前在else 块中的代码。然后有一个for 循环,类似于for(WebElement element : more){ element.click(); }。这就是你要找的东西吗?
  • 我在这里想要实现的是:只要这个元素存在 - bold**/html/body/div[1]/div/div[3]/div/div /div[1]/div/div[2]/div[2]/div/div[4]/buttonbold** 我想点击它,如果没有这样的元素我想执行此语句:
  • this : WebElement present = driver.findElement(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/ div[2]/div[2]/div/div[3]/div/table/tbody")); List list = present.findElements(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[ 2]/div/div[3]/div/table/tbody/tr")); System.out.println("TR总数:" + list.size());
  • 所以你不是想捕捉有几个这样的元素的情况吗?好的,我当然误解了。那么循环从何而来?

标签: java selenium


【解决方案1】:

我从您的查询中了解到,您希望多次循环您的 IF 条件语句,直到您的 else 条件满足。为此,您可以尝试以下代码:

     (1) try{
      (2)    String xpathVAL="/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[4]/button";
         (3) int i=1;
       (4)   while(i!=0){

              (5)   if(driver.findElements(By.xpath(xpathVAL)).size() != 0)

             (6)    {
                (7)      driver.findElement(By.xpath(xpathVAL).click();
                (8)   Thread.sleep(2000);

               (9)  }

             (10)    else{
              (11)              Thread.sleep(2000);
              (12)         WebElement present = driver.findElement(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[3]/div/table/tbody"));
    (13)    List<WebElement> list = present.findElements(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[3]/div/table/tbody/tr"));
     (14)   LOGGER.debug("Total Number of TR: " + list.size());
        (15) i=0;
        (16)         }
      (17)    }
    (18)      }catch(Exception e){
        (19)  LOGGER.debug("Exception Caught");
(20) WebElement present = driver.findElement(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[3]/div/table/tbody"));
       List<WebElement> list = present.findElements(By.xpath("/html/body/div[1]/div/div[3]/div/div/div[1]/div/div[2]/div[2]/div/div[3]/div/table/tbody/tr"));

          }

我认为您的要求是一直单击一个按钮,直到出现某个窗口并且该按钮消失为止。我对此的建议是,应用“Thread.sleep(//some 3-4 seconds//)”。但是,它的编码风格很差,许多标准都不建议使用强力线程。你可以在那里放一些其他的隐式等待。另外,如果您的元素在一定时间后没有找到,您可以在一定时间间隔后应用中断条件,否则它将进入无限循环。如果您在编写代码时遇到问题,请告诉我,我会为您提供帮助。

编辑

尝试以下几点来删除缓存中不存在的元素:-

  1. 在第 8 行和第 11 行使用显式等待(Thread.sleep)
  2. 将您的 xpath 从基于位置的位置更改为某个 id/name/class 类型。将其更改为基于 NAME 可以获得更清晰的元素图片,即使其位置已更改。
  3. 如果在第 20 行捕获到异常,请再次重新初始化元素。

【讨论】:

  • 我正在旅行,并没有实际测试过代码。抱歉,如果出现一些错误。
  • 乐于助人,如果满足您的要求,请接受答案:)
  • 嗨@aditya。我仍然有这个错误:(在缓存中找不到元素-也许页面在被查找后已经改变了
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2017-07-24
  • 1970-01-01
相关资源
最近更新 更多