Так что я думаю, что ваш тест является нахождение и перемещение мимо проверки невидимости элемента перед тем появляется панель. Это потому, что есть состояние гонки того, что происходит во-первых, проверка теста 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")
Возможно ли, что селен продвигается мимо ожидания до панели с сообщением «Пожалуйста, подождите ...» становится видимым? – Woodham
+1, попробуйте, чтобы панель была видимой первой, чтобы убедиться, что селен начинает ждать, пока панель исчезнет после того, как она станет видимой. – Kudin
Если вы уверены, что отображается панель, вы можете ждать следующего элемента, который будет отображаться 'WebElement элемент = wait.until ( ExpectedConditions.visibilityOfElementLocated (By.id ("disabilityFlagRadio")));' – Harish