Selenium检查动态元素

时间:2018-05-30 17:16:35

标签: java selenium selenium-webdriver

硒/爪哇

任务是获取两个可能元素的文本:elem1和elem2。 当显示场景A - elem1时,elem2的定位器不存在。反之亦然。

我的代码:

 public void checkTextInPopUp() {
    List<WebElement> commonDiv= driver.findElements(By.xpath(".//* 
[@id='CheckStockProductAvailabilityWidget']/div/div"));

    if (commonDiv.size()>=1) {

        addToCartStock.click();         

    } else {

System.out.println(driver.findElement(By.id("ajaxErrorMsg")).getText());
        closeCheckStock.click();            
    }
}

我的代码总是只在scenario1中工作,并在发送element2时失败,说:无法找到element2。

Elem1 html:

    <div id="CheckStockProductAvailabilityWidget" class="dijitContentPane" 
lang="en" controllerid="CheckStockProductAvailabilityController" 
widgetid="CheckStockProductAvailabilityWidget" 
dojotype="wc.widget.RefreshArea" style="">
      <div class="row-fluid">
         <div class="span11">
            <p id="ajaxErrorMsg" class="error-font-color">Price & 
Availability Check cannot be executed for your order.</p>
         </div>
     </div>
  </div>
</div>

Elem2 html:

<div id="CheckStockProductAvailabilityWidget" class="dijitContentPane" 
lang="en" controllerid="CheckStockProductAvailabilityController" 
widgetid="CheckStockProductAvailabilityWidget" 
dojotype="wc.widget.RefreshArea" style="">
<div class="row-fluid">
  <div class="span11">
    <div class="row-fluid ">
       <div class="span12">

              Part# 00000
             <br/>
             <p>
        </div>
      </div>
  <div class="row-fluid space-bottom">
  <div class="row-fluid ">
  <div class="row-fluid mobile-inline-block">

两个元素都有共同点,并且两个元素都返回&#34; 1&#34;获取element.size

2 个答案:

答案 0 :(得分:0)

您可以修改以下代码

<强>代码:

    public void checkTextInPopUp(){

        WebElement rootElement=driver.findElement(By.id("CheckStockProductAvailabilityWidget"));
        List<WebElement> element1List=rootElement.findElements(By.xpath(".//div[@class='span11']/p"));

        if (element1List.size()==1) {
            ---Do your stuff----
            addToCartStock.click();
        } else {
            System.out.println(rootElement.findElement(By.xpath(".//div[@class='span12']")).getText());
        }
    }
}

<强>详细信息:

  1. 找到Root WebElement。因为,此元素始终在元素1和元素2 HTML
  2. 中可见
  3. 元素1一次可见或不可见。要避免NoSuchElementException,请使用findElements方法查找元素并将元素存储在List中(您可以使用根元素找到元素)
  4. 如果元素1 找到,则元素1将可见,element1大小将为1.
  5. 如果元素1 未找到,则元素2将可见并且 元素1大小为0。
    1. 可以根据元素大小条件添加逻辑
  6. 更新代码:

    List<WebElement> elementList=driver.findElements(By.xpath("//p[@id='ajaxErrorMsg']"));
    //If the element 1 html is present, then element list size will be 1, else it will be 0.
    if(elementList.size()>0){
        //element 1 related stuff
        ---Do your stuff----
                addToCartStock.click();
    }
    else{
        //element 2 related stuff
        System.out.println(rootElement.findElement(By.xpath(".//div[@class='span12']")).getText());
    }
    

答案 1 :(得分:0)

我通过使用try和catch找到了解决方案。会看看它是否理想。

public void getStockPopUpMessage() {

    try {
        driver.findElement(By.xpath(".//*[@id='ajaxErrorMsg']"));
        System.out.println("Stock displays: " + 
        driver.findElement(By.xpath(".//*[@id='ajaxErrorMsg']")).getText());
        closeCheckStock.click();
    } catch (NoSuchElementException e) {
        System.out.println("No ajax");
        dothis();
    }
}