1

У меня есть одна кнопка подтверждения, которая имеет некоторую задержку после того, как я нажму на нее (после того, как я нажму на нее, покажу мне сетку с элементами), а затем появится кнопка NEXT, которая перенаправляется на следующую страницу. У меня есть этот код:Selenium: Как я могу сказать Selenium, чтобы подождать элемента кнопки?

((JavascriptExecutor)driver).executeScript("arguments[0].click()",driver.findElement(By.cssSelector("div#button-verify-wrapper > a"))); 
Thread.sleep(18000); 
driver.findElement(By.xpath(".//*[@id='select-a-data-source-footer']/div/div/a")).click(); 
Thread.sleep(5000); 

Но я хочу Для перехода к новой нажмите на кнопку NEXT, ведь заряд сетки (это займет некоторое время, зависит от сервера на тот момент), потому что следующая кнопка только появляется после того, как появится сетка.

Есть ли селеновые предложения для этого?

+0

Я бы рекомендовал вам использовать инструкцию FluentWait https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html – Sandeep

ответ

2

Селен обеспечивает два типа waits следующим образом: -

  • Explicit wait: -

    Явное ожидание кода вы определяете ждать определенное условие произойти, прежде чем продолжить в коде. В худшем случае это Thread.sleep(), который устанавливает условие на точный период времени для ожидания. Существуют некоторые методы удобства, которые помогут вам написать код, который будет ждать только столько, сколько потребуется. WebDriverWait в сочетании с ExpectedCondition - это один из способов, которым это может быть достигнуто. Таким образом, вы должны попробовать, как: -

    WebDriverWait wait = WebDriverWait(drive, 10); 
    wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("div#button-verify-wrapper > a"))).click(); 
    
    wait.until(ExpectedConditions.elementToBeClickable(By.xpath(".//*[@id='select-a-data-source-footer']/div/div/a"))).click(); 
    //Now find further element with WebDriverWait for the process 
    
  • Implicit wait: -

    неявное ожидание сказать WebDriver опрашивать DOM в течение определенного периода времени при попытке найти элемент или элементы, если они являются не сразу доступны. Значение по умолчанию равно 0. После установки неявный ожидание устанавливается для срока действия экземпляра объекта WebDriver.

    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); 
    
    driver.findElement(By.cssSelector("div#button-verify-wrapper > a"))).click(); 
    driver.findElement(By.xpath(".//*[@id='select-a-data-source-footer']/div/div/a")).click(); 
    //Now find further element for the process 
    
+0

Эй, спасибо за ваш ответ. Я попробовал «Неявное ожидание», и это дает мне это исключение: http://imgur.com/a/cz2Z4 –

+0

Элемент состояний исключений в настоящее время не отображается, когда вы собираетесь щелкнуть, вы должны попробовать Явное ожидание, как предложено здесь, и дайте мне знать .. –

+0

Пробовал явную и аналогичную ошибку: http: // imgur.com/a/hiOrT –

0

Я бы выступать за явное ожидание, и вы даже можете сделать это обычным способом с явным ожиданием для повторного использования. Многие взаимодействия с кликом могут иметь явное ожидание того, что элемент станет кликабельным. Хотя это и не рекомендуется, я иногда понимаю, что Thread.sleep может быть единственным жизнеспособным вариантом, пока не будет реализован более эффективный подход.

Один из них упоминается как Саураб Гаур, WebDriverWait. Другой подобный вариант дает более подробный контроль и настраивает опрос.

Другой FluentWait: https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html

// 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")); 
    } 
    }); 

Примечание хотя, что с помощью FluentWait, вы можете ведитесь, думая, вы можете быть в состоянии игнорировать другие исключения класса, такие как StaleElementReference, и компилятор не будет жаловаться. StaleElementReference все равно может иметь место, то же самое для класса TimeoutException.

Смежные вопросы