2016-09-30 5 views
0

Ниже приведен фрагмент кода моего тестового примера selenium, где я использую метод select для выбора значения из раскрывающегося списка. И следующий шаг - щелкнуть на submit. Но к тому времени, когда я пытаюсь нажать на кнопку отправки страница не обновляется (который освежит ту же страницу), метаниевеб-драйвер selenium подождите, пока страница не будет обновлена ​​

element not clickable,StaleElementReference exception

. Единственное решение, которое работает для меня, - thread.sleep().

Я перепробовал все ниже варианты, но не везло :(

explicit wait(), wait.until(Exceptedcontions.visibility), element to be clickable() и т.д., перепробовал все решения на го полотна.

мне пришлось использовать thread.sleep() 3-4 раза тестовый случай, и у меня около 100 тестовых случаев, которые стоят много времени.

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

@Test 
@Timeout(group = Group.SLOW) 
public void testProvider() throws InterruptedException { 

    proceedToProvider(); 
    new Select(driver.findElement(By.id("searchId"))).selectByVisibleText("Search"); 
    Thread.sleep(2000); 
    driver.findElement(By.id("btnSubmit")).click(); 
    timeSplit("Search submitted"); 

Ниже приведена ошибка, которую я вижу при использовании других решений.

org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (1289, 141). Other element would receive the click: (Session info: chrome=53.0.2785.116) (Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Windows NT 6.1 SP1 x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 168 milliseconds Build info: version: '2.49.1', revision: '808c23b0963853d375cbe54b90bbd052e2528a54', time: '2016-01-21 09:37:52' System info: host: 'ALAKASIMA01-W7L', ip: '10.145.45.233', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_73' Driver info: org.openqa.selenium.remote.RemoteWebDriver Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={chromedriverVersion=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4), userDataDir=C:\Users\kasima01\AppData\Local\Temp\scoped_dir6628_12218}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=53.0.2785.116, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}] Session ID: 8bf0b4cc7efc715015509f4be345d14d

ответ

0
public void WaitForElementToLoad(String selector, String key, String seconds) 
      throws ValidationException { 

     Integer time = Integer.valueOf(seconds); 

     WebElement element = null; 

     while (time > 0) { 

      try { 
       element = getSpecificWebElement(selector, key); 

       break; 
      } catch (ValidationException e) { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e1) { 
        e1.printStackTrace(); 
       } 
       time--; 
      } 
     } 

     if (element == null && time <= 0) { 
       // throw your own exception 
     } 
    } 

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

Существует и другое решение - использовать driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

Specifies the amount of time the driver should wait when searching for an element if it is not immediately present.

Update:

Я думаю, что я лучше пост getSpecificWebElement

private WebElement getSpecificWebElement(String selector, String key) 
      throws ValidationException { 
     WebElement element = null; 

     String expression = ""; 

     By by = composeSelector(selector, key); 

     try { 
      element = FindElementBy(by); 
     } catch (TimeoutException e) { 

      throw new ValidationException("not found " + expression); 
     } catch (Exception e) { 
      throw new ValidationException(
        Exceptions.getShortStackTraceAsString(e)); 
     } 

     return element; 
} 


private WebElement FindElementBy(By by) { 

     final By selector = by; 

     ExpectedCondition<WebElement> ec = new ExpectedCondition<WebElement>() { 

      @Override 
      public WebElement apply(WebDriver driver) { 

       return driver.findElement(selector); 

      } 

     }; 

     WebDriverWait wait = new WebDriverWait(driver, 10); 

     return wait.until(ec); 
    } 

В этом случае время ожидания достаточно , будет X (значение прошедших секунд) * 10.

+0

@Test \t @Timeout (группа = Group.SLOW) \t общественного недействительными testProviderSearchDataShareOn() бросает InterruptedException, ValidationException { \t \t proceedToProviderScreen(); \t \t новый Выберите (driver.findElement (By.id ("searchId"))). SelectByVisibleText ("Поиск"); // \t \t Thread.sleep (2000); \t \t WaitForElementToLoad («id», «btnSubmit», «20»); Тот же элемент не вызывает щелчка. – maddie

+0

Рассмотрите некоторые элементы, которые покрывают ваш целевой элемент. Вам нужно снять барьер. –

0

Попробуйте это проверит всю страницу загружается?

static void waitForPageLoad(WebDriver wdriver) { 
    WebDriverWait wait = new WebDriverWait(wdriver, 60); 

    Predicate<WebDriver> pageLoaded = new Predicate<WebDriver>() { 

     @Override 
     public boolean apply(WebDriver input) { 
      return ((JavascriptExecutor) input).executeScript("return document.readyState").equals("complete"); 
     } 

    }; 
    wait.until(pageLoaded); 
} 

Надеюсь, что это сработает для вас.

+0

Не повезло, как только новый Select (driver.findElement (By.id ("searchId"))). SelectByVisibleText ("Поиск"); , драйвер выбрасывает исключение, исключающее клики. – maddie

+0

Вы вызывали waitForPageLoad перед выпиской? –

+0

Я действительно получаю сообщение об ошибке после инструкции select. Я попробовал waitForPageLoad() перед нажатием кнопки() на кнопке процесса. – maddie

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