From ffdb26a47b6dea21d9f057f5d9d05db9c9934c1c Mon Sep 17 00:00:00 2001 From: Valery Yatsynovich Date: Tue, 27 Sep 2022 11:10:14 +0300 Subject: [PATCH] [extension-selenium] Improve logging of search results (#3202) --- .../action/search/AbstractElementAction.java | 42 ++++++--- .../AbstractElementSearchActionTests.java | 93 +++++++++++-------- .../AbstractWebElementSearchAction.java | 6 +- .../ui/web/action/search/WebLocatorType.java | 2 +- .../search/ElementSearchActionTests.java | 18 ++-- .../action/search/LinkUrlPartSearchTests.java | 22 +++-- .../web/action/search/LinkUrlSearchTests.java | 8 +- 7 files changed, 113 insertions(+), 78 deletions(-) diff --git a/vividus-extension-selenium/src/main/java/org/vividus/ui/action/search/AbstractElementAction.java b/vividus-extension-selenium/src/main/java/org/vividus/ui/action/search/AbstractElementAction.java index b23e424737..cc3622e274 100644 --- a/vividus-extension-selenium/src/main/java/org/vividus/ui/action/search/AbstractElementAction.java +++ b/vividus-extension-selenium/src/main/java/org/vividus/ui/action/search/AbstractElementAction.java @@ -23,6 +23,7 @@ import javax.inject.Inject; +import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.By; import org.openqa.selenium.SearchContext; import org.openqa.selenium.StaleElementReferenceException; @@ -37,6 +38,10 @@ public abstract class AbstractElementAction implements IElementAction { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractElementAction.class); + private static final String NUMBER_OF_ELEMENTS_MESSAGE = "The total number of elements found by \"{}\" is {}"; + private static final String NUMBER_OF_FILTERED_ELEMENTS_MESSAGE = + NUMBER_OF_ELEMENTS_MESSAGE + ", the number of {} elements is {}"; + private IWaitActions waitActions; @Inject private ElementActions elementActions; private Duration waitForElementTimeout; @@ -75,15 +80,25 @@ private List findElements(SearchContext searchContext, By locator, V return Objects.requireNonNullElseGet(value, List::of); } List elements = searchContext.findElements(locator); - LOGGER.atInfo() - .addArgument(locator) - .addArgument(elements::size) - .log("Total number of elements found {} is {}"); + + if (Visibility.ALL == visibility || elements.isEmpty()) + { + LOGGER.atInfo() + .addArgument(() -> convertLocatorToReadableForm(locator)) + .addArgument(elements::size) + .log(NUMBER_OF_ELEMENTS_MESSAGE); + return elements; + } try { - return Visibility.ALL == visibility || elements.isEmpty() - ? elements - : filterElementsByVisibility(elements, visibility, retry); + List filteredElements = filterElementsByVisibility(elements, visibility, retry); + LOGGER.atInfo() + .addArgument(() -> convertLocatorToReadableForm(locator)) + .addArgument(elements::size) + .addArgument(visibility::getDescription) + .addArgument(filteredElements::size) + .log(NUMBER_OF_FILTERED_ELEMENTS_MESSAGE); + return filteredElements; } catch (StaleElementReferenceException e) { @@ -91,6 +106,11 @@ private List findElements(SearchContext searchContext, By locator, V } } + private static String convertLocatorToReadableForm(By locator) + { + return StringUtils.removeStart(locator.toString(), "By."); + } + protected List filterElementsByVisibility(List elements, Visibility visibility, boolean retry) { @@ -109,13 +129,7 @@ protected List filterElementsByVisibility(List elements, LOGGER.warn(e.getMessage(), e); return false; } - }).collect(Collectors.collectingAndThen(Collectors.toList(), list -> - { - LOGGER.atInfo().addArgument(visibility::getDescription) - .addArgument(list::size) - .log("Number of {} elements is {}"); - return list; - })); + }).collect(Collectors.toList()); } private List waitForElement(SearchContext searchContext, By locator, Visibility visibility) diff --git a/vividus-extension-selenium/src/test/java/org/vividus/ui/action/search/AbstractElementSearchActionTests.java b/vividus-extension-selenium/src/test/java/org/vividus/ui/action/search/AbstractElementSearchActionTests.java index a3c9e7fd8c..2c33fe7b3b 100644 --- a/vividus-extension-selenium/src/test/java/org/vividus/ui/action/search/AbstractElementSearchActionTests.java +++ b/vividus-extension-selenium/src/test/java/org/vividus/ui/action/search/AbstractElementSearchActionTests.java @@ -18,12 +18,15 @@ import static com.github.valfirst.slf4jtest.LoggingEvent.error; import static com.github.valfirst.slf4jtest.LoggingEvent.info; +import static com.github.valfirst.slf4jtest.LoggingEvent.warn; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.params.provider.Arguments.arguments; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -34,6 +37,7 @@ import java.util.List; import java.util.stream.Stream; +import com.github.valfirst.slf4jtest.LoggingEvent; import com.github.valfirst.slf4jtest.TestLogger; import com.github.valfirst.slf4jtest.TestLoggerFactory; import com.github.valfirst.slf4jtest.TestLoggerFactoryExtension; @@ -62,15 +66,19 @@ @ExtendWith({ TestLoggerFactoryExtension.class, MockitoExtension.class }) class AbstractElementSearchActionTests { - private static final String TOTAL_NUMBER_OF_ELEMENTS = "Total number of elements found {} is {}"; - private static final String NUMBER_OF_VISIBLE_ELEMENTS = "Number of {} elements is {}"; + private static final String TOTAL_NUMBER_OF_ELEMENTS = "The total number of elements found by \"{}\" is {}"; + private static final String NUMBER_OF_VISIBLE_ELEMENTS = + TOTAL_NUMBER_OF_ELEMENTS + ", the number of {} elements is {}"; private static final String EXCEPTION = "exception"; + private static final String ID = "id1"; + private static final By LOCATOR = By.id(ID); + private static final String LOGGED_LOCATOR = "id: " + ID; + private final TestLogger logger = TestLoggerFactory.getTestLogger(AbstractElementAction.class); @Mock private SearchContext searchContext; @Mock private IWaitActions waitActions; - @Mock private By locator; @Mock private ElementActions elementActions; @InjectMocks @@ -78,13 +86,13 @@ class AbstractElementSearchActionTests private void mockWaitForElements(List foundElements, List filteredElements) { - Duration timeout = Duration.ofSeconds(1); + var timeout = Duration.ofSeconds(1); elementSearchAction.setWaitForElementTimeout(timeout); var waitResult = new WaitResult>(); waitResult.setData(filteredElements); when(waitActions.wait(eq(searchContext), eq(timeout), argThat((ArgumentMatcher>>) condition -> { - when(searchContext.findElements(locator)).thenReturn(foundElements); + when(searchContext.findElements(LOCATOR)).thenReturn(foundElements); condition.apply(searchContext); return true; }), eq(false))).thenReturn(waitResult); @@ -100,7 +108,7 @@ void testGetAttributeType() void testFindElementsSearchContextIsNull() { var parameters = mock(SearchParameters.class); - var elements = elementSearchAction.findElements(null, locator, parameters); + var elements = elementSearchAction.findElements(null, LOCATOR, parameters); assertThat(elements, empty()); assertThat(logger.getLoggingEvents(), equalTo(List.of( error("Unable to locate elements, because search context is not set")))); @@ -110,9 +118,11 @@ void testFindElementsSearchContextIsNull() void shouldFindNoElements() { mockWaitForElements(List.of(), null); - var foundElements = elementSearchAction.findElements(searchContext, locator, new SearchParameters()); + var foundElements = elementSearchAction.findElements(searchContext, LOCATOR, new SearchParameters()); assertThat(foundElements, empty()); - assertThat(logger.getLoggingEvents(), equalTo(List.of(info(TOTAL_NUMBER_OF_ELEMENTS, locator, 0)))); + assertThat(logger.getLoggingEvents(), equalTo(List.of( + info(TOTAL_NUMBER_OF_ELEMENTS, LOGGED_LOCATOR, 0) + ))); } @Test @@ -122,11 +132,10 @@ void shouldFindVisibleElements() when(elementActions.isElementVisible(element)).thenReturn(true); var elements = List.of(element); mockWaitForElements(elements, elements); - var foundElements = elementSearchAction.findElements(searchContext, locator, new SearchParameters()); + var foundElements = elementSearchAction.findElements(searchContext, LOCATOR, new SearchParameters()); assertEquals(elements, foundElements); assertThat(logger.getLoggingEvents(), equalTo(List.of( - info(TOTAL_NUMBER_OF_ELEMENTS, locator, 1), - info(NUMBER_OF_VISIBLE_ELEMENTS, Visibility.VISIBLE.getDescription(), 1) + info(NUMBER_OF_VISIBLE_ELEMENTS, LOGGED_LOCATOR, 1, Visibility.VISIBLE.getDescription(), 1) ))); } @@ -136,11 +145,13 @@ void shouldFindAllElements() var element = mock(WebElement.class); var elements = List.of(element); mockWaitForElements(elements, elements); - var foundElements = elementSearchAction.findElements(searchContext, locator, + var foundElements = elementSearchAction.findElements(searchContext, LOCATOR, new SearchParameters().setVisibility(Visibility.ALL)); assertEquals(elements, foundElements); verifyNoInteractions(element, elementActions); - assertThat(logger.getLoggingEvents(), equalTo(List.of(info(TOTAL_NUMBER_OF_ELEMENTS, locator, 1)))); + assertThat(logger.getLoggingEvents(), equalTo(List.of( + info(TOTAL_NUMBER_OF_ELEMENTS, LOGGED_LOCATOR, 1) + ))); } @Test @@ -152,12 +163,11 @@ void shouldFindInvisibleElements() when(elementActions.isElementVisible(element2)).thenReturn(Boolean.FALSE); var elements = List.of(element1, element2); mockWaitForElements(elements, List.of(element2)); - var foundElements = elementSearchAction.findElements(searchContext, locator, + var foundElements = elementSearchAction.findElements(searchContext, LOCATOR, new SearchParameters().setVisibility(Visibility.INVISIBLE)); assertEquals(List.of(element2), foundElements); assertThat(logger.getLoggingEvents(), equalTo(List.of( - info(TOTAL_NUMBER_OF_ELEMENTS, locator, 2), - info(NUMBER_OF_VISIBLE_ELEMENTS, Visibility.INVISIBLE.getDescription(), 1) + info(NUMBER_OF_VISIBLE_ELEMENTS, LOGGED_LOCATOR, 2, Visibility.INVISIBLE.getDescription(), 1) ))); } @@ -167,15 +177,14 @@ void testFindElementsDisplayedOnly() var element1 = mock(WebElement.class); var element2 = mock(WebElement.class); var elementsList = List.of(element1, element2); - when(searchContext.findElements(locator)).thenReturn(elementsList); + when(searchContext.findElements(LOCATOR)).thenReturn(elementsList); when(elementActions.isElementVisible(element1)).thenReturn(Boolean.TRUE); when(elementActions.isElementVisible(element2)).thenReturn(Boolean.FALSE); - var foundElements = elementSearchAction.findElements(searchContext, locator, + var foundElements = elementSearchAction.findElements(searchContext, LOCATOR, new SearchParameters().setWaitForElement(false)); assertEquals(List.of(element1), foundElements); assertThat(logger.getLoggingEvents(), equalTo(List.of( - info(TOTAL_NUMBER_OF_ELEMENTS, locator, 2), - info(NUMBER_OF_VISIBLE_ELEMENTS, Visibility.VISIBLE.getDescription(), 1) + info(NUMBER_OF_VISIBLE_ELEMENTS, LOGGED_LOCATOR, 2, Visibility.VISIBLE.getDescription(), 1) ))); } @@ -183,43 +192,49 @@ void testFindElementsDisplayedOnly() void testFindAllElementsWithException() { var element = mock(WebElement.class); - var elements = List.of(element); - Mockito.doThrow(new StaleElementReferenceException(EXCEPTION)).when(elementActions).isElementVisible(element); - when(searchContext.findElements(locator)).thenReturn(elements); - var foundElements = elementSearchAction.findElements(searchContext, locator, + var exception = new StaleElementReferenceException(EXCEPTION); + doThrow(exception).when(elementActions).isElementVisible(element); + when(searchContext.findElements(LOCATOR)).thenReturn(List.of(element)); + var foundElements = elementSearchAction.findElements(searchContext, LOCATOR, new SearchParameters().setWaitForElement(false)); assertEquals(0, foundElements.size()); verify(element, Mockito.never()).getSize(); verifyNoInteractions(waitActions); - assertThat(logger.getLoggingEvents().get(0), equalTo(info(TOTAL_NUMBER_OF_ELEMENTS, locator, 1))); + assertThat(logger.getLoggingEvents(), equalTo(List.of( + warn(exception, exception.getMessage()), + info(NUMBER_OF_VISIBLE_ELEMENTS, LOGGED_LOCATOR, 1, Visibility.VISIBLE.getDescription(), 0) + ))); } private static Stream provideStaleElementTestData() { - Answer elementStale = invocation -> { - throw new StaleElementReferenceException(EXCEPTION); - }; - Answer elementDisplayed = invocation -> true; - return Stream.of(Arguments.of(elementStale, 0, 2), Arguments.of(elementDisplayed, 1, 2)); + var exception = new StaleElementReferenceException(EXCEPTION); + return Stream.of( + arguments((Answer) invocation -> { throw exception; }, 0, List.of( + warn(exception, exception.getMessage()), + info(NUMBER_OF_VISIBLE_ELEMENTS, LOGGED_LOCATOR, 1, Visibility.VISIBLE.getDescription(), 0) + )), + arguments((Answer) invocation -> true, 1, List.of( + info(NUMBER_OF_VISIBLE_ELEMENTS, LOGGED_LOCATOR, 1, Visibility.VISIBLE.getDescription(), 1) + )) + ); } @ParameterizedTest @MethodSource("provideStaleElementTestData") - void testStaleElementSearchRetry(Answer answer, int expectedSize, - int isDisplayedMethodInvocations) + void testStaleElementSearchRetry(Answer answer, int expectedSize, List loggingEvents) { elementSearchAction.setRetrySearchIfStale(true); var element = mock(WebElement.class); - var elements = List.of(element); - Mockito.doThrow(new StaleElementReferenceException(EXCEPTION)).doAnswer(answer) - .when(elementActions).isElementVisible(element); - when(searchContext.findElements(locator)).thenReturn(elements); + var exception = new StaleElementReferenceException(EXCEPTION); + doThrow(exception).doAnswer(answer).when(elementActions).isElementVisible(element); + when(searchContext.findElements(LOCATOR)).thenReturn(List.of(element)); var foundElements = elementSearchAction - .findElements(searchContext, locator, new SearchParameters().setWaitForElement(false)); + .findElements(searchContext, LOCATOR, new SearchParameters().setWaitForElement(false)); assertEquals(expectedSize, foundElements.size()); verify(element, Mockito.never()).getSize(); verifyNoInteractions(waitActions); - verify(elementActions, times(isDisplayedMethodInvocations)).isElementVisible(element); - assertThat(logger.getLoggingEvents().get(0), equalTo(info(TOTAL_NUMBER_OF_ELEMENTS, locator, 1))); + verify(elementActions, times(2)).isElementVisible(element); + assertThat(logger.getLoggingEvents(), equalTo(loggingEvents)); } } diff --git a/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/search/AbstractWebElementSearchAction.java b/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/search/AbstractWebElementSearchAction.java index da111edc2d..bc2bf7ba20 100644 --- a/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/search/AbstractWebElementSearchAction.java +++ b/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/search/AbstractWebElementSearchAction.java @@ -54,7 +54,7 @@ protected List findElementsByText(SearchContext searchContext, By de if (elements.isEmpty()) { String text = parameters.getValue(); - By newLocator = generateCaseInsensitiveLocator(text, tagNames); + By newLocator = By.xpath(generateCaseInsensitiveXpath(text, tagNames)); return findElements(searchContext, newLocator, parameters) .stream() .filter(element -> matchesToText(element, text)) @@ -63,7 +63,7 @@ protected List findElementsByText(SearchContext searchContext, By de return elements; } - protected static By generateCaseInsensitiveLocator(String text, String... tagNames) + protected static String generateCaseInsensitiveXpath(String text, String... tagNames) { @SuppressWarnings("PMD.InsufficientStringBufferDeclaration") StringBuilder locator = new StringBuilder(); @@ -77,7 +77,7 @@ protected static By generateCaseInsensitiveLocator(String text, String... tagNam .append(ELEMENT_WITH_ANY_ATTRIBUTE_OR_TEXT_CASE_INSENSITIVE) .append("])]|"); } - return XpathLocatorUtils.getXPathLocator(locator.substring(0, locator.length() - 1), text.toLowerCase()); + return XpathLocatorUtils.getXPath(locator.substring(0, locator.length() - 1), text.toLowerCase()); } protected boolean matchesToText(WebElement element, final String text) diff --git a/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/search/WebLocatorType.java b/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/search/WebLocatorType.java index a1134e153e..09613903ee 100644 --- a/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/search/WebLocatorType.java +++ b/vividus-plugin-web-app/src/main/java/org/vividus/ui/web/action/search/WebLocatorType.java @@ -43,7 +43,7 @@ public enum WebLocatorType implements LocatorType @Override public By buildBy(String value) { - return AbstractWebElementSearchAction.generateCaseInsensitiveLocator(value.toLowerCase(), "*"); + return By.xpath(AbstractWebElementSearchAction.generateCaseInsensitiveXpath(value.toLowerCase(), "*")); } }, TOOLTIP("Tooltip", TooltipFilter.class) diff --git a/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/ElementSearchActionTests.java b/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/ElementSearchActionTests.java index 0704a06252..8e14c2c2d3 100644 --- a/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/ElementSearchActionTests.java +++ b/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/ElementSearchActionTests.java @@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; -import static org.vividus.ui.web.action.search.AbstractWebElementSearchAction.generateCaseInsensitiveLocator; +import static org.vividus.ui.web.action.search.AbstractWebElementSearchAction.generateCaseInsensitiveXpath; import java.util.List; @@ -52,9 +52,11 @@ class ElementSearchActionTests private static final String ANY_TEXT = "*"; private static final String TEXT_TRANSFORM = "text-transform"; private static final String TEXT = "Text"; - private static final By ELEMENT_BY_TEXT_LOCATOR = By.xpath(".//*[contains(normalize-space(text()), 'Text')]"); - private static final String TOTAL_NUMBER_OF_ELEMENTS = "Total number of elements found {} is {}"; + private static final String ELEMENT_BY_TEXT_XPATH = ".//*[contains(normalize-space(text()), 'Text')]"; + private static final By ELEMENT_BY_TEXT_LOCATOR = By.xpath(ELEMENT_BY_TEXT_XPATH); + private static final String TOTAL_NUMBER_OF_ELEMENTS = "The total number of elements found by \"{}\" is {}"; private static final String NOT_SET_CONTEXT = "Unable to locate elements, because search context is not set"; + private static final String XPATH_LOCATOR_PREFIX = "xpath: "; private final TestLogger logger = TestLoggerFactory.getTestLogger(AbstractElementAction.class); @@ -86,7 +88,7 @@ void shouldFindElementsByText() new SearchParameters(TEXT).setVisibility(Visibility.ALL).setWaitForElement(false), ANY_TEXT); assertEquals(List.of(webElement), foundElements); assertThat(logger.getLoggingEvents(), equalTo(List.of( - info(TOTAL_NUMBER_OF_ELEMENTS, ELEMENT_BY_TEXT_LOCATOR, 1) + info(TOTAL_NUMBER_OF_ELEMENTS, XPATH_LOCATOR_PREFIX + ELEMENT_BY_TEXT_XPATH, 1) ))); } @@ -113,15 +115,15 @@ private void testFindElementsByTextWithEmptyTextTransform(String value, String c List expected) { lenient().when(searchContext.findElements(ELEMENT_BY_TEXT_LOCATOR)).thenReturn(List.of()); - lenient().when(searchContext.findElements(generateCaseInsensitiveLocator(value, ANY_TEXT))).thenReturn( - List.of(webElement)); + String caseInsensitiveXpath = generateCaseInsensitiveXpath(value, ANY_TEXT); + lenient().when(searchContext.findElements(By.xpath(caseInsensitiveXpath))).thenReturn(List.of(webElement)); when(webElementActions.getCssValue(webElement, TEXT_TRANSFORM)).thenReturn(cssTextTransform); var foundElements = elementSearchAction.findElementsByText(searchContext, ELEMENT_BY_TEXT_LOCATOR, new SearchParameters(value).setVisibility(Visibility.ALL).setWaitForElement(false), ANY_TEXT); assertEquals(expected, foundElements); assertThat(logger.getLoggingEvents(), equalTo(List.of( - info(TOTAL_NUMBER_OF_ELEMENTS, ELEMENT_BY_TEXT_LOCATOR, 0), - info(TOTAL_NUMBER_OF_ELEMENTS, generateCaseInsensitiveLocator(value, ANY_TEXT), 1) + info(TOTAL_NUMBER_OF_ELEMENTS, XPATH_LOCATOR_PREFIX + ELEMENT_BY_TEXT_XPATH, 0), + info(TOTAL_NUMBER_OF_ELEMENTS, XPATH_LOCATOR_PREFIX + caseInsensitiveXpath, 1) ))); } } diff --git a/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/LinkUrlPartSearchTests.java b/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/LinkUrlPartSearchTests.java index 0235309f8b..9bb38acd33 100644 --- a/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/LinkUrlPartSearchTests.java +++ b/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/LinkUrlPartSearchTests.java @@ -52,10 +52,9 @@ class LinkUrlPartSearchTests private static final String URL_PART = "urlPart"; private static final String URL = "url" + URL_PART; private static final String OTHER_URL = "otherUrl"; - private static final By LINK_URL_PART_LOCATOR = By.xpath(".//a[contains (translate(@href," - + " 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), \"urlpart\")]"); private static final String LINK_WITH_PART_URL_PATTERN = ".//a[contains(@href, %s)]"; - private static final String TOTAL_NUMBER_OF_ELEMENTS = "Total number of elements found {} is {}"; + private static final String TOTAL_NUMBER_OF_ELEMENTS = "The total number of elements found by \"{}\" is {}"; + private static final String XPATH_LOCATOR_PREFIX = "xpath: "; private final TestLogger logger = TestLoggerFactory.getTestLogger(AbstractElementAction.class); @@ -114,10 +113,12 @@ void testSearchContextCaseSensitive() { SearchParameters parameters = new SearchParameters(URL_PART, Visibility.ALL, false); search.setCaseSensitiveSearch(true); - By locator = XpathLocatorUtils.getXPathLocator(LINK_WITH_PART_URL_PATTERN, URL_PART); - when(searchContext.findElements(locator)).thenReturn(webElements); + String xpath = XpathLocatorUtils.getXPath(LINK_WITH_PART_URL_PATTERN, URL_PART); + when(searchContext.findElements(By.xpath(xpath))).thenReturn(webElements); assertEquals(webElements, search.search(searchContext, parameters)); - assertThat(logger.getLoggingEvents(), equalTo(List.of(info(TOTAL_NUMBER_OF_ELEMENTS, locator, 1)))); + assertThat(logger.getLoggingEvents(), equalTo(List.of( + info(TOTAL_NUMBER_OF_ELEMENTS, XPATH_LOCATOR_PREFIX + xpath, 1) + ))); } @Test @@ -125,10 +126,13 @@ void testSearchContextCaseInsensitive() { SearchParameters parameters = new SearchParameters(URL_PART, Visibility.ALL, false); search.setCaseSensitiveSearch(false); - when(searchContext.findElements(LINK_URL_PART_LOCATOR)).thenReturn(webElements); + String linkUrlPartXpath = ".//a[contains (translate(@href," + + " 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), \"urlpart\")]"; + when(searchContext.findElements(By.xpath(linkUrlPartXpath))).thenReturn(webElements); assertEquals(webElements, search.search(searchContext, parameters)); - assertThat(logger.getLoggingEvents(), - equalTo(List.of(info(TOTAL_NUMBER_OF_ELEMENTS, LINK_URL_PART_LOCATOR, 1)))); + assertThat(logger.getLoggingEvents(), equalTo(List.of( + info(TOTAL_NUMBER_OF_ELEMENTS, XPATH_LOCATOR_PREFIX + linkUrlPartXpath, 1) + ))); } @Test diff --git a/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/LinkUrlSearchTests.java b/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/LinkUrlSearchTests.java index ab716ef66b..4aadb9df4d 100644 --- a/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/LinkUrlSearchTests.java +++ b/vividus-plugin-web-app/src/test/java/org/vividus/ui/web/action/search/LinkUrlSearchTests.java @@ -57,7 +57,6 @@ class LinkUrlSearchTests private static final String URL_PATH = "/urlPath"; private static final String SIMPLE_URL = "http://example.com"; private static final String URL = SIMPLE_URL + URL_PATH; - private static final By LOCATOR = By.xpath(".//a[normalize-space(@href)=\"" + URL + "\"]"); private static final String URL_WITH_SLASH = SIMPLE_URL + "/"; private static final String URL_WITH_QUERY = SIMPLE_URL + "/?q=uri"; private static final String URL_OPAQUE = "tel:1234567"; @@ -110,13 +109,14 @@ void testFindLinksByTextByLinkText() linkUrlSearch.setCaseSensitiveSearch(true); var parameters = new SearchParameters(URL, Visibility.VISIBLE, false); var webElements = List.of(webElement); - when(searchContext.findElements(LOCATOR)).thenReturn(webElements); + String xpath = ".//a[normalize-space(@href)=\"" + URL + "\"]"; + when(searchContext.findElements(By.xpath(xpath))).thenReturn(webElements); when(elementActions.isElementVisible(webElement)).thenReturn(true); var foundElements = linkUrlSearch.search(searchContext, parameters); assertEquals(webElements, foundElements); assertThat(logger.getLoggingEvents(), equalTo(List.of( - info("Total number of elements found {} is {}", LOCATOR, 1), - info("Number of {} elements is {}", Visibility.VISIBLE.getDescription(), 1) + info("The total number of elements found by \"{}\" is {}, the number of {} elements is {}", + "xpath: " + xpath, 1, Visibility.VISIBLE.getDescription(), 1) ))); }