2017-05-05 8 views
2

私はmd-sidenavでWebページを持っており、セレンでテストしようとしています。私がページ上でやっていることは、md-sidenavの中の要素をクリックしようとするときを除いてすべて機能します。 driver.findElement(By.name( "elementName")またはidでmd-sidenav内のWeb要素にアクセスする場合、要素がnullではないことがわかります)また、anにアクセスすると、要素しかし、私はそれらをクリックしようとすると、それは私にElementNotVisibleExceptionを与える:。ここでは要素セレンはmd-sidenavの中をクリック

をクリックすることはできませんが、HTMLです:

import java.util.List; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.ie.InternetExplorerDriver; 
import org.openqa.selenium.support.ui.ExpectedCondition; 
import org.openqa.selenium.support.ui.Select; 
import org.openqa.selenium.support.ui.Wait; 
import org.openqa.selenium.support.ui.WebDriverWait; 

public class EcsTest { 
    static WebDriver driver; 
    static Wait<WebDriver> wait; 
    static String prevText = ""; 
    static String currText = ""; 

    public static void main(String[] args) { 
     System.setProperty("webdriver.ie.driver","C:\\Dvp\\Irs\\EcsTest\\IEDriverServer.exe"); 
     driver = new InternetExplorerDriver(); 
     wait = new WebDriverWait(driver, 30); 
     driver.get("http://localhost:8080/ecs/index.html"); 

     try { 
      driver.findElement(By.id("element1")).click(); 

      wait.until(new ExpectedCondition<Boolean>() { 
       @Override 
       public Boolean apply(WebDriver webDriver) { 
        currText = webDriver.findElement(By.id("field1")).getText(); 
        return !prevText.equals(currText); 
       } 
      }); 

      prevText = currText; 

      driver.findElement(By.id("element2")).click(); 
      //driver.findElement(By.name("dispositionSelect")).sendKeys("Add to Scheme"); 

      Select selectElement = new Select(driver.findElement(By.name("selectElement1"))); 
      disposition.selectByVisibleText("Some form"); 

      WebElement sideNav = driver.findElement(By.id("sideNavRight")); 
      WebElement closeBtn = sideNav.findElement(By.id("navClose")); 

      /* 
       This prints out: 
       sideNav is not null!, closeBtn is not null!, not displayed!, enabled! 
      */ 
      System.out.println(
        "sideNav is " + ((sideNav == null) ? "null!" : "not null!") + 
        ", closeBtn is " + ((closeBtn == null) ? "null!" : "not null!") + 
        ", " + ((closeBtn.isDisplayed()) ? "displayed!" : "not displayed!") + 
        ", " + ((closeBtn.isEnabled()) ? "enabled!" : "not enabled!")); 


      WebElement select = sideNav.findElement(By.name("category")); 
      List<WebElement> options = select.findElements(By.tagName("md-option")); 

      /* 
       This prints out: 
       select: category, visible: false 
      */ 
      System.out.println(
       "select: " + select.getAttribute("name") + ", visible: " + select.isDisplayed()); 

      /* 
       This crashes: 
       ElementNotVisibleException: Cannot click on element 

       Without this click, I can see the options fine but the option click crashes 
      */ 
      select.click(); 

      for(WebElement option : options) { 
       System.out.println("option: " + option.getAttribute("value")); 

       if(option.getAttribute("value").equals(optionName)) { 
        option.click(); 
        System.out.println("option: " + option.getAttribute("value") + " clicked!"); 
        break; 
       } 
      } 
     } catch (Exception exp) { 
      exp.printStackTrace(); 
     } 
     finally { 
      driver.close(); 
     } 
    } 
} 

<body ng-controller='MyController as my' ng-cloak> 
<section layout="row" column> 
    <md-sidenav id="sideNavRight" class="md-sidenav-right" md-component-id="right" ng-init="my.selectTab(1)"> 

    <div ng-controller="MyController" ng-show="my.isSelected(1)"> 
     <md-toolbar class="md-theme-light"> 
      <h1 class="md-toolbar-tools">Some Form</small> 
      <md-button id="navClose" ng-click="close()" class="closeIcon" aria-label="Close"> 
       <md-icon md-svg-icon="assets/img/ic_close_white_24px.svg"></md-icon><sr-only>Close</sr-only> 
      </md-button></h1> 
     </md-toolbar> 

     <md-content> 
      <div layout="column" index="0"> 
      <h3>Some Information</h3> <br /> 
       <form name="myForm"> 
        <div layout="row" layout-align="start" flex="100"> 
         <md-input-container flex=""> 
          <label>Category:</label> 
           <md-select name="category" required="" ng-model="menu.category" > 
            <md-option class="choices" value="cat1">Category1</md-option> 
            <md-option value="cat2">Category2</md-option> 
            <md-option value="cat3">Category3</md-option> 
           </md-select> 
           <div class="errors" ng-messages="myForm.category.$error"> 
            <div ng-message="required">Required</div> 
           </div> 
         </md-input-container> 
        </div> 
         <div layout="row" class="pull-right"> 
          <md-button class="btn" ng-click="clearValue()">Clear</md-button> &nbsp; 
          <md-button class="btn" ng-click="menu.updateCart();menu.selectTab(2);">Next</md-button> 
         </div> 
       </form> 
      </div> 
     </md-content> 
    </div> 
    </md-sidenav> 
    </section> 

    .... 
    rest of the page 
    .... 
</body> 

そしてここでは、Seleniumのコードです

ご迷惑をおかけいたします。

+0

いくつかの推奨チェックがあります。 (1)別のブラウザを試してみてください.MSIEドライバは薄れていることが知られています。特にActionsの場合は、Chromeで答えを試してみてください。 (2)サイドナビゲーションを開いてクリックするまでに10秒間待ってください。 (3)デバッグ出力を追加する - sideNavが表示されていますか? (4)閉じるボタンの要素の下にある「」要素をクリックしてみてください。 –

答えて

0

アクションクラスを作成します。

Actions builder = new Actions(driver); 

そして限り、あなたはMD-sidenavにいるようすべての操作のためにそれを使用します。

WebElement yourElement = sideNav.findElement(By.id("elementId")); 
builder.moveToElement(yourElement).click().build().perform(); 
builder.moveToElement(yourElement).sendKeys("2017-05-04").build().perform(); 

編集: これをスローしない例外と例外を発生させますが、実際には操作を実行しません。私。ボタンをクリックしたと報告され、例外はスローされませんでしたが、アクションも取られませんでした。 私は幸せになるには速すぎました。表示されるように前記要素のためのいくつかのウェイトを追加

1

試してみてください。

WebDriverWait wait = new WebDriverWait (driver,20); 
wait.until(ExpectedConditions.visibilityOf(select)); 

select.click(); 

あなたはまだ下の回答の1で述べたようにActions classを使用してみてくださいその要素をクリックすることができない場合。

関連する問題