В ожидании видимости элемента - PullRequest
2 голосов
/ 17 апреля 2019

Использование Java и Selenium.

У нас есть метод waitForXPathVisibility (xpath), который в конечном итоге вызывает wait.untilExpectedConditions ... visibilityOfElement. Этот метод работает отлично. Я просто сократил это здесь. Так что поверьте мне, что waitForXpathVisibility (xpath) будет ждать, пока он не станет видимым.

Итак, у нас есть страница медицинских специальностей. Первоначально это было только на английском языке. Так что если вы ищете «neuro», HTML будет выглядеть примерно так:

<ul id="ui-id-1" tabindex="0" class="ui-menu ui-widget ui-widget-content ui-autocomplete ui-front" style="width: 476.672px; position: relative; top: -1005px; left: 542.828px; display: none;">
 <LI class="ui-menu-item"> Neurology</Li>
 <LI class="ui-menu-item"> Neuro Surgeon </li>
 </UL>

Затем они добавили испанский, так что не все результаты вернутся, но будут видны только испанские. Новый

в конец предыдущего. И UL, даже отображаемые, имеют «display; none» как часть идентификатора стиля.

Ранее при выполнении поиска я делал бы

 waitForXpathVisibility("//li[@class='ui-menu-item']");

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

Есть ли способ подождать, пока какой-либо элемент, соответствующий xpath, будет виден? Обратите внимание, что visibilityOfAllElements () не будет работать, потому что не все они будут видны.

Полагаю, что можно сделать, предварительно получить счетчик всех элементов с @id и с "width" как частью стиля. «display; none» не будет работать, потому что есть другие s с этим значением. Затем выполните поиск и подождите, пока число s увеличится на 1, получите идентификатор последнего, а затем подождите, пока под ним не появится

, но это кажется немного большим. Должно быть как-то ждать видимого ? Я мог тогда вернуть его родителя

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Я думаю, что вы ищете

//ul[contains(@class,'ui-menu')][last()]/li
^ finds a UL
    ^ that contains the 'ui-menu' class
                                ^ get the last one (the one that contains visible elements)
                                        ^ get the LI children

Вы должны быть в состоянии подождать, пока все они будут видны, используя visibilityOfAllElements.


Примечание: не пишите метод waitForXPathVisibility(), ограниченный только XPath. Это позволяет вам написать метод для каждого используемого вами типа локатора (CSS-селектор, имя, идентификатор и т. Д.). Вместо этого возьмите By в качестве параметра и сделайте его общим. Смотри ниже.

public void waitForVisibilityOfElement(By locator)
{
    new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(locator));
}

Вы также можете написать один для более чем одного элемента

public void waitForVisibilityOfElements(By locator)
{
    new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(locator));
}

и вы используете его как

By someElementLocator = By.id("someId");
By someElementLocator = By.xpath("//ul[contains(@class,'ui-menu')][last()]/li"); // or this
By someElementLocator = By.cssSelector("ul.ui-menu"); // or this
waitForVisibilityOfElement(someElementLocator);
0 голосов
/ 17 апреля 2019

Используйте JavaScript executor, чтобы получить скрытое значение. Если вы хотите получить значение Neurologa, попробуйте код ниже. Надеюсь, это поможет.

WebElement element=driver.findElement(By.xpath("(//ul[@id='ui-id-2']/li[@class='ui-menu-item'])[1]"));
JavascriptExecutor js = (JavascriptExecutor) driver;
String output=(String) js.executeScript("return arguments[0].innerHTML;", element);
System.out.println(output);

ИЛИ

WebElement element=driver.findElement(By.xpath("//li[@class='ui-menu-item'][normalize-space(text())='Neurologa']"));
JavascriptExecutor js = (JavascriptExecutor) driver;
String output=(String) js.executeScript("return arguments[0].innerHTML;", element);
System.out.println(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...