Ошибка при создании List'a ElementsContainer

selenide
java
Теги: #<Tag:0x00007fedb95c69b8> #<Tag:0x00007fedb95c6850>

(Andrey) #1

Здрайствуйте!
Подскажите, что может быть не так.
При инициализации страницы MyPage ошибка в строке:

    private List<MySubForm> mySubForm;

при этом ошибка:
Element not found {By.className: MyForm}
Expected: exist
Вопрос можно ли в контейнере объявлять лист контейнеров. Если можно, то что я сделал не так

    
public class MyPage {
    @FindBy(className = "MyForm")
    private MyForm myForm;

    public MyPage(WebDriver driver) {
        PageFactory.initElements(new SelenideFieldDecorator(driver), this);
    }

    public MyForm getMyForm() {
        return myForm;
    }
}

public class MyForm extends ElementsContainer {
    @FindBy(className = "MySubForm")
    private List<MySubForm> mySubForm;

    public List<MySubForm> getMySubForm() {
       return mySubForm;
    }
}

public class MySubForm extends ElementsContainer{
    @FindBy(className = "myElement")
    private SelenideElement myElement;

    public SelenideElement getMyElement() {
        return myElement;
    }
}

(asolntsev) #2

Прежде всего, вам не нужно использовать напрямую webdriver и вызывать pageFactory. Уберите этот конструктор.


(Andrey) #3

А каким образом будут инициализироваться мои поля класса MyPage?


(asolntsev) #4

Как в примере на сайте:
MyPage page = open("http://...", MyPage.class);


(asolntsev) #5

ну как, получилось?


(Andrey) #6

Простите, не мог сразу ответить...
Убрал декоратор. Использовал MyPage page = open("http://...", MyPage.class);
Ошибка повторилась


(asolntsev) #7

Скиньте полный стэк трейс и URL (или хотя бы полный HTML) странички.
Похоже, такого элемента действительно нет на странице.


(Andrey) #8

А как быть с Proxy?
Разве суть не в том, чтобы поместить в объект proxy если элемента еще на странице нет..
Дело тогда не в листе а в proxy...


(asolntsev) #9

Да, по идее так и надо. Поэтому мне и кажется, что элемента вообще нет - ни сейчас, ни позже.


(Andrey) #10

Да посмотрел его там нет...
А что значит "ни позже"?
Т.е. selenide все равно будет искать элемент?
Это т.е. если у меня есть какой-то блок, который я объявил в форме и он появляется при определенных условиях, то при инициализации такой формы у меня всегда будет эксепшн?


(asolntsev) #11

Теоретически Selenide должен создать враппер вместо настоящего элемента.
Т.е. если элемент-контейнер доступен не сразу, а появится позже при определённых условиях, инициализация страницы не должна грохнуться. Поэтому я и прошу прислать стэк трейс и URL странички.


(Andrey) #12

Понял)
сейчас будет!


(Andrey) #13

    <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div class="MainDiv">
			
		<div class = "MyForm">asdasd
			<div class="MySubForm">
				<textarea class="myElement1">SPAN 1</textarea>
			</div>
		</div>
		
		<div class="childDiv_2">
			<div class="childDiv_2_1">
				<textarea class="myElement">SPAN 2.1</textarea>
			</div>
		</div>
	</div>
</body>
</html>

    [TestNG] Running:
  /tmp/testng-eclipse-2104204198/testng-customsuite.xml

FAILED CONFIGURATION: @BeforeClass initDriver
Element not found {By.className: MyForm1}
Expected: exist
Screenshot: file:/home/bob/all/ws/artifactId/build/reports/tests/1450193867409.0.png
Timeout: 4 s.
Caused by: NoSuchElementException: no such element: Unable to locate element: {"method":"class name","selector":"MyForm1"}
	at com.codeborne.selenide.impl.AbstractSelenideElement.createElementNotFoundError(AbstractSelenideElement.java:704)
	at com.codeborne.selenide.impl.WaitingSelenideElement.createElementNotFoundError(WaitingSelenideElement.java:82)
	at com.codeborne.selenide.impl.AbstractSelenideElement.dispatchAndRetry(AbstractSelenideElement.java:115)
	at com.codeborne.selenide.impl.AbstractSelenideElement.invoke(AbstractSelenideElement.java:65)
	at com.codeborne.selenide.impl.WaitingSelenideElement.invoke(WaitingSelenideElement.java:19)
	at com.sun.proxy.$Proxy6.findElements(Unknown Source)
	at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElements(DefaultElementLocator.java:85)
	at com.codeborne.selenide.impl.SelenideElementListProxy.invoke(SelenideElementListProxy.java:33)
	at com.sun.proxy.$Proxy7.iterator(Unknown Source)
	at com.codeborne.selenide.impl.SelenideFieldDecorator.createElementsContainerList(SelenideFieldDecorator.java:57)
	at com.codeborne.selenide.impl.SelenideFieldDecorator.decorate(SelenideFieldDecorator.java:43)
	at org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:113)
	at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:105)
	at com.codeborne.selenide.impl.SelenideFieldDecorator.initElementsContainer(SelenideFieldDecorator.java:78)
	at com.codeborne.selenide.impl.SelenideFieldDecorator.createElementsContainer(SelenideFieldDecorator.java:69)
	at com.codeborne.selenide.impl.SelenideFieldDecorator.decorate(SelenideFieldDecorator.java:40)
	at org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:113)
	at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:105)
	at com.codeborne.selenide.Selenide.page(Selenide.java:451)
	at com.codeborne.selenide.Selenide.page(Selenide.java:440)
	at com.codeborne.selenide.Selenide.open(Selenide.java:90)
	at test.MyTest.initDriver(MyTest.java:35)
	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:497)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
	at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:510)
	at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:211)
	at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)
	at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:170)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:104)
	at org.testng.TestRunner.privateRun(TestRunner.java:774)
	at org.testng.TestRunner.run(TestRunner.java:624)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:359)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
	at org.testng.SuiteRunner.run(SuiteRunner.java:261)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
	at org.testng.TestNG.run(TestNG.java:1048)
	at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:112)
	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:205)
	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:176)
Caused by: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"class name","selector":"MyForm1"}
  (Session info: chrome=46.0.2490.80)
  (Driver info: chromedriver=2.19.346067 (6abd8652f8bc7a1d825962003ac88ec6a37a82f1),platform=Linux 3.19.0-32-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 10 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.48.2', revision: '41bccdd', time: '2015-10-09 19:59:12'
System info: host: 'bob-pc', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.19.0-32-generic', java.version: '1.8.0_60'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={userDataDir=/tmp/.com.google.Chrome.MQEDO6}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=46.0.2490.80, platform=LINUX, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: c45d477cefcc42a2f9fd5b0d63fcf17c
*** Element info: {Using=class name, value=MyForm1}
Command duration or timeout: 578 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.48.2', revision: '41bccdd10cf2c0560f637404c2d96164b67d9d67', time: '2015-10-09 13:08:06'
System info: host: 'bob-pc', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.19.0-32-generic', java.version: '1.8.0_60'
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={userDataDir=/tmp/.com.google.Chrome.MQEDO6}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=46.0.2490.80, platform=LINUX, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, webdriver.remote.sessionid=4d045992-9354-4f53-b642-a3623d96e167, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: 4d045992-9354-4f53-b642-a3623d96e167
*** Element info: {Using=class name, value=MyForm1}
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
	at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
	at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:647)
	at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:353)
	at org.openqa.selenium.remote.RemoteWebDriver.findElementByClassName(RemoteWebDriver.java:467)
	at org.openqa.selenium.By$ByClassName.findElement(By.java:391)
	at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:345)
	at com.codeborne.selenide.impl.WebElementSelector.findElement(WebElementSelector.java:28)
	at com.codeborne.selenide.impl.WaitingSelenideElement.getActualDelegate(WaitingSelenideElement.java:56)
	at com.codeborne.selenide.impl.WaitingSelenideElement.getDelegate(WaitingSelenideElement.java:43)
	at com.codeborne.selenide.impl.AbstractSelenideElement.dispatchAndRetry(AbstractSelenideElement.java:91)
	... 43 more
Caused by: org.openqa.selenium.remote.ScreenshotException: Screen shot has been taken
Build info: version: '2.48.2', revision: '41bccdd10cf2c0560f637404c2d96164b67d9d67', time: '2015-10-09 13:08:06'
System info: host: 'bob-pc', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.19.0-32-generic', java.version: '1.8.0_60'
Driver info: driver.version: RemoteWebDriver
	at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:138)
	... 52 more
Caused by: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"class name","selector":"MyForm1"}
  (Session info: chrome=46.0.2490.80)
  (Driver info: chromedriver=2.19.346067 (6abd8652f8bc7a1d825962003ac88ec6a37a82f1),platform=Linux 3.19.0-32-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 10 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.48.2', revision: '41bccdd', time: '2015-10-09 19:59:12'
System info: host: 'bob-pc', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.19.0-32-generic', java.version: '1.8.0_60'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={userDataDir=/tmp/.com.google.Chrome.MQEDO6}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=46.0.2490.80, platform=LINUX, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: c45d477cefcc42a2f9fd5b0d63fcf17c
*** Element info: {Using=class name, value=MyForm1}
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.48.2', revision: '41bccdd10cf2c0560f637404c2d96164b67d9d67', time: '2015-10-09 13:08:06'
System info: host: 'bob-pc', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.19.0-32-generic', java.version: '1.8.0_60'
Driver info: driver.version: EventFiringWebDriver
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
	at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
	at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:647)
	at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:353)
	at org.openqa.selenium.remote.RemoteWebDriver.findElementByClassName(RemoteWebDriver.java:467)
	at org.openqa.selenium.By$ByClassName.findElement(By.java:391)
	at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:345)
	at sun.reflect.GeneratedMethodAccessor18.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.openqa.selenium.support.events.EventFiringWebDriver$2.invoke(EventFiringWebDriver.java:102)
	at com.sun.proxy.$Proxy1.findElement(Unknown Source)
	at org.openqa.selenium.support.events.EventFiringWebDriver.findElement(EventFiringWebDriver.java:187)
	at org.openqa.selenium.remote.server.handler.FindElement.call(FindElement.java:48)
	at org.openqa.selenium.remote.server.handler.FindElement.call(FindElement.java:1)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at org.openqa.selenium.remote.server.DefaultSession$1.run(DefaultSession.java:176)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

SKIPPED CONFIGURATION: @AfterClass driverQuit
SKIPPED: myTestFunc

===============================================
    Default test
    Tests run: 1, Failures: 0, Skips: 1
    Configuration Failures: 1, Skips: 1
===============================================


===============================================
Default suite
Total tests run: 1, Failures: 0, Skips: 1
Configuration Failures: 1, Skips: 1
===============================================

[TestNG] Time taken by org.testng.reporters.EmailableReporter2@6fdb1f78: 20 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 3 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@424c0bc4: 8 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@2a3046da: 21 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@64cee07: 6 ms
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@1517365b: 12 ms

(asolntsev) #14

Ну так и вправду нет на странице элемента .MyForm1 - есть только .MyForm


(Andrey) #15

Я думал мы это выяснили) -

Да посмотрел его там нет...
А что значит "ни позже"?
Т.е. selenide все равно будет искать элемент?
Это т.е. если у меня есть какой-то блок, который я объявил в форме и он появляется при определенных условиях, то при инициализации такой формы у меня всегда будет эксепшн?

И остался вопрос про proxy и то, что он "странно" работает. Ведь если это прокси, то неважно существует элемент или нет. Или я не правильно понимаю...


(asolntsev) #16

Да, всё верно, для прокси неважно, что элемента нет на странице сразу. Он подождёт (до 4 секунд), пока элемент появится. Но элемент, который ты ищешь, так и не появился по истечении 4 секунд. Поэтому прокси выкинули ошибку.


(Andrey) #17

Ясно. Этого я и боялся)
Огромное вам спасибо за помощь и терпение!)
Может быть подскажите в чем минусы такого подхода:
В HtmlElements proxy в таком случае не выдает ошибку. Декоратор просто инициализирует элементы прокси заглушками. Хотя там тоже есть дефолтный поиск в течении 5 сек.(AjaxElementLocator), хотя для вас это, наверное, не секрет)
Как вы думаете что в этом плохого?
Ведь можно и на них потом вэйты повесить...
или эта уже другая тема...


(asolntsev) #18

Я не понимаю, чего вы хотите добиться.
Если этого элемента нет и никогда не будет, то тест никогда не сможет работать - ни с Selenide, ни с HtmlElements.


(Andrey) #19

Он появится, но только после какого-то определенного действия, например, нажатия на кнопку. А когда нажмут на кнопку нам известно быдет только в самом тетсте. Вот и есть потребность просто положить туда прокси и не ждать пока он появится.


(vmaximv) #20

Разработчик не читатель - разработчик писатель.