Каков наилучший способ избежать исключения NoSuchElementException в Selenium?

Я написал несколько тестовых примеров в Selenium WebDriver с помощью Java и выполнил их в сетке (концентратор и несколько узлов). Я заметил, что из-за NoSuchElementException произошло несколько тестов. Каков наилучший и надежный способ избежать исключения NoSuchElementException и обеспечить, чтобы элемент всегда был найден?

    Вы никогда не сможете быть уверены в том, что элемент будет найден, на самом деле это цель функциональных тестов – рассказать вам, если что-либо изменилось на вашей странице. Но одна вещь, которая определенно помогает, заключается в добавлении ожиданий элементов, которые часто вызывают NoSuchElementException например

     WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id)); 

    Я полностью согласен с Петром Менсиком выше. Вопрос, который вы никогда не можете сказать, присутствует ли элемент. Вы должны четко понимать, почему, когда это происходит. По моему опыту, я должен сказать, что это происходит по следующим причинам:

    • 1) Страница все еще отображается, и вы уже закончили поиск элементов и не получили исключения элемента.
    • 2) Вторая причина заключается в том, что AJAX еще не вернулся, и вы уже получили NoSuchElementException
    • 3) Третий наиболее очевидный: элемент на самом деле не на странице.

    поэтому самый надежный способ ИМХО справиться со всеми этими тремя условиями, используя один вызов функции, – использовать fluentWait как предлагал Amith003.

    поэтому код должен быть следующим:

    пусть ур элемент имеет локатор:

     String elLocXpath= "..blablabla"; WebElement myButton= fluentWait(By.xpath(elLocXpath)); myButton.click(); public WebElement fluentWait(final By locator){ Wait wait = new FluentWait(driver) .withTimeout(30, TimeUnit.SECONDS) .pollingEvery(5, TimeUnit.SECONDS) .ignoring(org.openqa.selenium.NoSuchElementException.class); WebElement foo = wait.until( new Function() { public WebElement apply(WebDriver driver) { return driver.findElement(locator); } } ); return foo; }; 

    Кроме того, если ваша цель – надежный перенос кода fluentWait() с помощью блока try{} catch{} .

    Также не забывайте о

      public boolean isElementPresent(By selector) { return driver.findElements(selector).size()>0; } 

    это также полезно.

    Поэтому, чтобы завершить все упомянутые, если вы хотите избежать исключения NoElement просто обработайте его должным образом, так как никто не может обеспечить присутствие элемента на странице.

    Надеюсь, теперь вам станет понятнее. С уважением

    вы также можете использовать FluentWait ,

    Каждый экземпляр FluentWait определяет максимальное время ожидания условия, а также частоту проверки состояния.

    Кроме того, пользователь может настроить wait для игнорирования определенных типов исключений во время ожидания, например NoSuchElementExceptions при поиске элемента на странице.

     // Waiting 30 seconds for an element to be present on the page, checking // for its presence once every 5 seconds. Wait wait = new FluentWait(driver) .withTimeout(30, SECONDS) .pollingEvery(5, SECONDS) .ignoring(NoSuchElementException.class); WebElement foo = wait.until(new Function() { public WebElement apply(WebDriver driver) { return driver.findElement(By.id("foo")); } }); 

    Нажмите здесь для дополнительной информации

     WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); wait.until(ExpectedConditions.elementToBeClickable(By.id)); 

    elementToBeClickable ожидает активации и видимости элемента

     public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) { FluentWait fWait = new FluentWait(driver).withTimeout(timoutSec, TimeUnit.SECONDS) .pollingEvery(pollingSec, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class, TimeoutException.class); for (int i = 0; i < 2; i++) { try { //fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id='reportmanager-wrapper']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title='We are processing through trillions of data events, this insight may take more than 15 minutes to complete.']"))); fWait.until(ExpectedConditions.visibilityOf(element)); fWait.until(ExpectedConditions.elementToBeClickable(element)); } catch (Exception e) { System.out.println("Element Not found trying again - " + element.toString().substring(70)); e.printStackTrace(); } } return element; } 

    Обычно я использую эту строку в основной функции

     public static void main(String[] args) throws ParseException { driver= new ChromeDriver(); driver.manage().window().maximize(); **driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);** 

    Надеюсь это поможет.

    Мы можем применить нижеприведенные коды, чтобы удалить это условие исключения

    1. Применяя WebDriverWait, объект webdriver ждет определенное время (во втором) элемента для его видимости.

        WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.visibilityOf(link)); 
    2. Мы можем обрабатывать NoSuchElementException через блок try-catch внутри метода Generic

        public boolean isElementPresent(By by) { boolean isPresent = true; try { driver.findElement(by); } catch (NoSuchElementException e) { isPresent = false; } return isPresent } 

    http://selenium-code.blogspot.in/2017/08/selenium-exception-nosuchelementexcepti.html

    Давайте будем гением компьютера.