org.openqa.selenium.ElementNotVisibleException: элемент в настоящее время не отображается при установке флажка через SeleniumWebDriver и Java - PullRequest
0 голосов
/ 09 октября 2018

Я должен установить флажок, который содержится в следующем фрагменте HTML.Флажок содержится во входном теге

<div formarrayname="entityTypes" fxlayout="" fxlayoutgap="10px" class="ng-untouched ng-pristine ng-valid ng-star-inserted" style="flex-direction: row; box-sizing: border-box; display: flex;">
                  <div class="form-row ng-untouched ng-pristine ng-valid" fxlayout="row" fxlayoutgap="10px" style="flex-direction: row; box-sizing: border-box; display: flex;">
                    <app-checkbox formcontrolname="isSelected" _nghost-c26="" class="ng-untouched ng-pristine ng-valid"><div _ngcontent-c26="" class="checkbox-wrapper">

  <span _ngcontent-c26="" class="tix-checkbox" fxlayout="row" fxlayoutalign="start center" style="flex-direction: row; box-sizing: border-box; display: flex; max-height: 100%; place-content: center flex-start; align-items: center;">
    <!---->
    <input _ngcontent-c26="" type="checkbox" name="undefined" class="ng-star-inserted" style="" xpath="1">
  
      Funder
      <label _ngcontent-c26=""></label>
  </span>
  
  <!---->

  <!---->

</div>
</app-checkbox>
                  </div>
                </div>

Я пробовал разные вещи, чтобы идентифицировать и выбрать его, но он никогда не виден.Я распечатал текст метки флажка на консоли, поэтому не могу понять, почему сам флажок не отображается.Следующий код Java успешно печатает метку, но не может установить флажок и выбрасывает элемент ошибки невидимым.

//print text of input box
WebElement labelFunder = driver.findElement(By.xpath("//div[@fxflex='50']//div[3]//div[1]//app-checkbox[1]//div[1]//span[1]//input[1]"));
String textFunderLabel2 = labelFunder.getAttribute("innerText").toString();
System.out.println(textFunderLabel);
labelFunder.click();

Я пробовал разные ожидания, но это также не было успешным.

//select the funder checkbox
//driver.findElement(By.xpath("//div[@fxflex='50']//div[3]//div[1]//app-checkbox[1]//div[1]//span[1]//input[@type='checkbox']")).click();
//WebDriverWait wait = new WebDriverWait(driver, 30);
//WebElement checkbox = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html[1]/body[1]/app-root[1]/main[1]/section[1]/div[2]/app-company-detail[1]/div[2]/form[1]/md-tab-group[1]/div[1]/md-tab-body[1]/div[1]/div[1]/div[2]/div[1]/div[2]/div[3]/div[1]/app-checkbox[1]/div[1]/span[1]/input[1]")));
//checkbox.click();

Может ли кто-нибудь указать мне правильное направление здесь

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Это полное сообщение об ошибке ...

Exception in thread "main" org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with Command duration or timeout: 2.05 seconds

... означает, что требуемый элемент не был виден в HTML DOM , тогда как WebDriver экземпляр пытается найти его.


ElementNotVisibleException

ElementNotVisibleException выбрасывается, чтобы указать, что хотя элемент присутствует в DOM Tree , оно не видно и поэтому не может взаимодействовать с ним.Это исключение runtime и имеет следующую иерархию:

java.lang.RuntimeException
    org.openqa.selenium.WebDriverException
        org.openqa.selenium.InvalidElementStateException
            org.openqa.selenium.ElementNotInteractableException
                org.openqa.selenium.ElementNotVisibleException

Сводка полей

Поля этого исключения наследуются от класса org.openqa.селен. WebDriverException и следующие:

Modifier and Type                        Field and Description
---------------------------------        ---------------------
protected static java.lang.String        BASE_SUPPORT_URL 
static java.lang.String                  DRIVER_INFO 
static java.lang.String                  SESSION_ID 

Причина

Один возможный отрыв от ElementNotVisibleException заключается в том, что WebElement - это присутствует в HTML, и это исключение обычно встречается при попытке click() или read атрибута элемента, который скрыт от просмотра.


Решение

Как ElementNotVisibleException гарантирует, что WebElement будет представлять в HTML, поэтому решение будет в два раза больше, согласноследующие шаги, как описано ниже:

  • Если следующим шагом является чтение любого атрибута нужного элемента, то вам нужно вызвать WebDriverWait в сочетании с ExpecДля условия tedConditions установлено значение visibilityOfElementLocated следующим образом:

    //using id attribute
    new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.id("element_id"))).getAttribute("innerHTML");
    //using linkText attribute          
    new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.linkText("element_linkText"))).getAttribute("innerHTML");
    //using cssSelector     
    new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("element_cssSelector"))).getAttribute("innerHTML");
    //using xpath           
    new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath"))).getAttribute("innerHTML");
    
  • Если следующим шагом будет вызов click() натребуемый элемент, то вам нужно вызвать WebDriverWait в сочетании с предложением ExpectedConditions , установленным в elementToBeClickable , следующим образом:

    //using id attribute
    new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.id("element_id"))).click();
    //using linkText attribute          
    new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.linkText("element_linkText"))).click();
    //using cssSelector     
    new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.cssSelector("element_cssSelector"))).click();
    //using xpath           
    new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("element_xpath"))).click();
    

Этот сценарий использования

Требуемый элемент - это Angular элемент, поэтому необходимо активировать WebDriverWait , чтобы элемент был кликабельным , и вы можете использовать одно из следующих решений:

  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("span.tix-checkbox input.ng-star-inserted[name='undefined']"))).click();
    
  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class='tix-checkbox']//input[@class='ng-star-inserted' and @name='undefined']"))).click();
    
0 голосов
/ 09 октября 2018

Попробуйте с кликом по JavaScript:

public void clickElementWithJS(By locator) {
    String jsClickCode = "arguments[0].scrollIntoView(true); arguments[0].click();";
    try {
        WebElement elementToClick = driver.findElement(locator);
        ((JavascriptExecutor) driver).executeScript(jsClickCode, elementToClick);
    } catch(Exception e) {
        System.out.println("Element could not be clicked.. "  + e.getMessage());
    }
}
...