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

Мне нужно установить флажок, который содержится в следующем фрагменте 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();

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

Спасибо.


person James Finnerty    schedule 09.10.2018    source источник


Ответы (2)


Попробуйте с 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());
    }
}
person Infern0    schedule 09.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, он не виден и поэтому не может быть взаимодействовал с. Это исключение среды выполнения со следующей иерархией:

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

Сводка полей

Поля этого исключения унаследованы от класса org.openqa.selenium.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 в сочетании с ExpectedConditions задано значение 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();
    
person DebanjanB    schedule 10.10.2018