$(byText("")) & unexpected quotes (Selenide)

webdriver
selenide
Теги: #<Tag:0x00007fedb9bf3e08> #<Tag:0x00007fedb9bf3cc8>

(Pavel Ozerov) #1

Добрый день!

В Selenide есть возможность вытащить элемент, используя ‘byText’, который ищет текст целиком. Подробнее об этом можно почитать тут: http://selenide.org/javadoc.html/ и тут: https://asolntsev.github.io/en/2015/12/31/selenide-at-advent-calendar/

Однако, похоже, что в результате искомый текст оборачивается в одинарные кавычки из-за чего не срабатывает проверка текста. Скажем, если я ищу на странице testText, то метод возвращает мне ‘testText’. Сразу оговорюсь, что если искать этот же элемент по тексту напрямую по xPath, то все работает корректно. Кто-нибудь сталкивался с подобным? И есть ли возможность обойти эту проблему, используя этот конкретный метод?

Спасибо!


(asolntsev) #2

Привет!
Если бы так было, то метод byText() не работал бы вообще - нигде и никогда. А он работает.

Приведите конкретный пример кода, который не находит элемент по тексту. И кусок html, в котором есть этот текст. И полный текст ошибок со стэктрейсом.


(Pavel Ozerov) #3

Привет!

HTML:

<p class="example__class">Dunkel Pilsner Märzen</p>

Текст на сайте:

DUNKEL PILSNER 
MÄRZEN

Тест:

public void test() {
    open(URL_LOGIN_PAGE);
    $(byText("DUNKEL PILSNER MÄRZEN")).shouldHave(text("DUNKEL PILSNER MÄRZEN"));
}

Stack trace:

Element not found {by text: DUNKEL PILSNER MÄRZEN}
Expected: text 'Dunkel Pilsner Märzen'

Timeout: 4 s.
Caused by: NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":".//*/text()[normalize-space(translate(string(.), '
	at com.codeborne.selenide.impl.WebElementSource.createElementNotFoundError(WebElementSource.java:31)
	at com.codeborne.selenide.impl.ElementFinder.createElementNotFoundError(ElementFinder.java:82)
	at com.codeborne.selenide.impl.WebElementSource.checkCondition(WebElementSource.java:59)
	at com.codeborne.selenide.commands.Should.should(Should.java:35)
	at com.codeborne.selenide.commands.Should.execute(Should.java:29)
	at com.codeborne.selenide.commands.Should.execute(Should.java:12)
	at com.codeborne.selenide.commands.Commands.execute(Commands.java:144)
	at com.codeborne.selenide.impl.SelenideElementProxy.dispatchAndRetry(SelenideElementProxy.java:87)
	at com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:63)
	at com.sun.proxy.$Proxy2.shouldHave(Unknown Source)
	at com.tacticRealTimeTests.tests.brand.BrandTest.test(BrandTest.java:45)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":".//*/text()[normalize-space(translate(string(.), '	
 ', '    ')) = "DUNKEL PILSNER MÄRZEN"]/parent::*"}
  (Session info: headless chrome=65.0.3325.181)
  (Driver info: chromedriver=2.36.540469 (1881fd7f8641508feb5166b7cae561d87723cfa8),platform=Mac OS X 10.13.4 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.8.1', revision: '6e95a6684b', time: '2017-12-01T18:33:54.468Z'
System info: host: 'MacBook.local', ip: 'fe80:0:0:0:185f:cd4e:f2e3:103a%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.13.4', java.version: '1.8.0_152'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: true, acceptSslCerts: true, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.36.540469 (1881fd7f864150..., userDataDir: /var/folders/9_/3h4txz3n3vj...}, cssSelectorsEnabled: true, databaseEnabled: false, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: MAC, platformName: MAC, rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, unexpectedAlertBehaviour: , unhandledPromptBehavior: , version: 65.0.3325.181, webStorageEnabled: true}
Session ID: 68205f5c461e383d078fb43e8384ab09
*** Element info: {Using=xpath, value=.//*/text()[normalize-space(translate(string(.), '	
 ', '    ')) = "DUNKEL PILSNER MÄRZEN"]/parent::*}
	at sun.reflect.GeneratedConstructorAccessor9.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
	at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
	at org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)
	at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80)
	at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:164)
	at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:601)
	at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:371)
	at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:473)
	at org.openqa.selenium.By$ByXPath.findElement(By.java:361)
	at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:363)
	at com.codeborne.selenide.impl.WebElementSelector.findElement(WebElementSelector.java:29)
	at com.codeborne.selenide.impl.ElementFinder.getWebElement(ElementFinder.java:56)
	at com.codeborne.selenide.impl.WebElementSource.checkCondition(WebElementSource.java:44)
	... 30 more


Process finished with exit code 255

(asolntsev) #4

Ну так блин, текст же маленькими буквами, а ищите вы большими.
Вот такая строчка работает:

$(byText("Dunkel Pilsner Märzen")).shouldHave(text("DUNKEL PILSNER MÄRZEN"));


(Pavel Ozerov) #5

И правда. My bad. Спасибо за помощь!