2016-07-25 3 views
1

В моем коде мне нужно «Подождите ...» заблокировал пользовательский интерфейс на панели выше, чтобы сначала исчезнуть, а затем переместиться на панель ниже, и, следовательно, я помещаю явное ожидание этого конкретного блока пяди. Но даже несмотря на то, что над панелью заблокирована, ее функциональность сохранения все еще продолжается, после чего функциональность щелчка панели запускается последовательно.Явное ожидание не работает в Selenium Webdriver

driver.findElement(By.id("saveHouseholdMember")).click(); 
WebDriverWait uiBlock = new WebDriverWait(driver, 30); 
uiBlock.until(ExpectedConditions.invisibilityOfElementWithText(By.xpath("/html/body/div[2]/form[1]/div/table/tbody/tr/td/span"), "Please wait...")); 
driver.findElement(By.id("disabilityFlagRadio")).click(); 

Здесь, при нажатии кнопки «Сохранить», эта панель блокируется сообщением «Подождите ...». Драйвер должен подождать, пока текст «Подождите ...» исчезнет, ​​а затем должен выполнить описанную ниже функциональность щелчка, но это не так, как ожидалось. Сохранение этой панели обычно занимает около 15 секунд.

Я также назвал ссылку ниже, но не смог найти полезные данные. Wait is not working in selenium webdriver

+1

Возможно ли, что селен продвигается мимо ожидания до панели с сообщением «Пожалуйста, подождите ...» становится видимым? – Woodham

+0

+1, попробуйте, чтобы панель была видимой первой, чтобы убедиться, что селен начинает ждать, пока панель исчезнет после того, как она станет видимой. – Kudin

+1

Если вы уверены, что отображается панель, вы можете ждать следующего элемента, который будет отображаться 'WebElement элемент = wait.until ( ExpectedConditions.visibilityOfElementLocated (By.id ("disabilityFlagRadio")));' – Harish

ответ

2

Так что я думаю, что ваш тест является нахождение и перемещение мимо проверки невидимости элемента перед тем появляется панель. Это потому, что есть состояние гонки того, что происходит во-первых, проверка теста Selenium или веб-сайт, делающий панель видимой. Вы можете (вроде) исправить это, сначала проверив, появится ли панель, и только затем проверит, что она исчезла. Это ограничивает некоторые аспекты состояния гонки. Это нет однако, исправить гонки состояние проблема. В следующем примере, если панель появляется, а затем исчезает до, код селена выполняет поиск видимой панели. Лучшим подходом было бы искать какое-то состояние, чтобы код, вызывающий панель, исчезал и выполнялся, когда она завершена, но я не знаю кода или логики страницы. Например, если у веб-разработчиков есть действие сохранения (после завершения), добавьте класс CSS к некоторому элементу. Тогда ваш тест может подождать, пока элемент получит этот класс. Наивный пример (с гонкой условием):

// Do stuff to get to the page needed for the test 
driver.findElement(By.id("saveHouseholdMember")) 
     .click(); 
// Make sure the panel first appears and then disappears 
By panelBy = By.xpath("/html/body/div[2]/form[1]/div/table/tbody/tr/td/span"); 
new WebDriverWait(driver, 30).until(ExpectedConditions.visibilityOfElementLocated(panelBy)); 
new WebDriverWait(driver, 30).until(ExpectedConditions.invisibilityOfElementLocated(panelBy)); 
// Panel is gone, click the next button 
driver.findElement(By.id("disabilityFlagRadio")) 
     .click(); 

Обратите внимание, что 30 в создании ожидания веб-драйвере означает, что он будет продолжать проверять для соответствующего элемента в желаемом состоянии видимости в течение до 30 секунд. Если в тот момент не будет найден соответствующий элемент с правильным состоянием видимости, будет выбрано значение TimeoutException. Также обратите внимание, что панель находится в XPath, которую вы предоставили. Однако я не рекомендую это выражение XPath из-за того, что он является абсолютным. Я уклоняюсь от XPath, когда это возможно, в качестве локатора Selenium из-за того, что он может быть хрупким и раздражающим, чтобы читать для тестирования. Обычно вы можете получить один и тот же элемент (более легко) с помощью других стратегий локатора (например, селекторов CSS, имя, идентификатор и т. Д.) Таким образом, чтобы много очиститель для чтения. Когда вам do абсолютно необходимо XPath (например, возможно, вам нужно найти какой-то конкретный текст на странице), то используйте относительный XPath. Для (упрощенно) примера ниже:

<html> 
    <body> 
     <div> 
      <span> 
       <input name="foo"></input> 
      </span> 
     </div> 
    </body> 
</html> 

Если вы используете абсолютную XPath, чтобы найти этот вход, он будет выглядеть следующим образом:

By.xpath("/html/body/div/span/input") 

Но что селектор сломается, если какая-либо часть всей этой цепи изменения (например, добавляется div, который не изменяет поведение вообще, нарушит тесты). Вместо этого вы можете использовать относительный XPath:

By.xpath("//input[@name='foo']") 

Обратите внимание, что даже этот пример является ошибочным и представляет собой пример относительного XPath.Если вы на самом деле видели выше фрагмент кода, вы должны, вероятно, просто сделать:

By.name("foo") 
+0

Ваш объяснение очень хорошее .. действительно ценит .. но почему вы предоставляете решение для видимости диапазона, а затем невидимость диапазона, если бы его можно было просто достичь, ожидая следующего элемента как «элемент WebElement = wait.until (ExpectedConditions.visibilityOfElementLocated (By .id ("disabilityFlagRadio"))); 'вместо? –

+0

Мне кажется, что на странице есть 2 раздела с первой частью, затрагивающей верхнюю секцию, а секция с идентификатором 'disabilityFlagRadio' находится в нижней части. Если элемент, расположенный по этому идентификатору, отображается на экране во время сохранения верхней части, тогда просто ожидание его видимости будет иметь такое же состояние гонки (например, до появления всплывающего окна «Сохранение» селен может найти элемент и сказать «да» , это видно "). Если, однако, это неверно и что элемент * только * появляется после завершения сохранения, это будет проще/лучше. –

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