Изменить пароль Тестовые случаи Selenium - Debug
Ниже приведен тест, который я написал для смены пароля.
@Тестовое задание
public void changePassword() throws IOException, InterruptedException {
Login();
driver.findElement(By.xpath(".//*[@id='wrapper']/div[1]/div[2]/div/div/ul/li[3]/a")).click();
driver.findElement(By.xpath(".//*[@id='wrapper']/div[1]/div[2]/div/div/ul/li[3]/ul/li[3]/a")).click();
driver.findElement(By.xpath(".//*[@id='change-password']/div[1]/div/input")).sendKeys("abcd");
driver.findElement(By.xpath(".//*[@id='Users_password']")).sendKeys("xyz123456");
driver.findElement(By.xpath(".//*[@id='repassword']")).sendKeys("xyz123456");
driver.findElement(By.xpath(".//*[@id='change-password']/div[4]/div/input")).click();
}
}
Ниже приведена ошибка, которую я получаю, я проверил правильность Xpath, все еще получаю эту ошибку -
org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":".//*[@id='change-password']/div[1]/div/input"}
Command duration or timeout: 2.81 seconds
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:423)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:215)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:167)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:671)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:410)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:509)
at org.openqa.selenium.By$ByXPath.findElement(By.java:361)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:402)
at pages.ChangePass.changePassword(ChangePass.java:16)
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.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:661)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:744)
at org.testng.TestRunner.run(TestRunner.java:602)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
at org.testng.TestNG.runSuites(TestNG.java:1144)
at org.testng.TestNG.run(TestNG.java:1115)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)
Caused by: org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":".//*[@id='change-password']/div[1]/div/input"}
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
System info: host: 'DESKTOP-1AKPPH7', ip: '192.168.56.1', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_111'
Driver info: driver.version: unknown
at <anonymous class>.FirefoxDriver.prototype.findElementInternal_(file:///C:/Users/Avinash/AppData/Local/Temp/anonymous9034314523683234934webdriver-profile/extensions/fxdriver@googlecode.com/components/driver-component.js:11390)
at <anonymous class>.FirefoxDriver.prototype.findElement(file:///C:/Users/Avinash/AppData/Local/Temp/anonymous9034314523683234934webdriver-profile/extensions/fxdriver@googlecode.com/components/driver-component.js:11399)
at <anonymous class>.DelayedCommand.prototype.executeInternal_/k(file:///C:/Users/Avinash/AppData/Local/Temp/anonymous9034314523683234934webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12879)
at <anonymous class>.DelayedCommand.prototype.executeInternal_(file:///C:/Users/Avinash/AppData/Local/Temp/anonymous9034314523683234934webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12884)
at <anonymous class>.DelayedCommand.prototype.execute/<(file:///C:/Users/Avinash/AppData/Local/Temp/anonymous9034314523683234934webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12826)
Мои вопросы - 1. Что не так в приведенном выше коде, когда я выполняю это, я перехожу на экран смены пароля. 2. Является ли вышеуказанный способ лучшим способом проверить функциональность смены пароля? 3. Есть ли еще тестовые сценарии, которые вы можете рекомендовать мне включить и как?
2 ответа
Вот ответы на ваш вопрос:
What is wrong in above code
:
xpaths
Вы построили, например, .//*[@id='wrapper']/div[1]/div[2]/div/div/ul/li[3]/a
, .//*[@id='wrapper']/div[1]/div[2]/div/div/ul/li[3]/ul/li[3]/a
а также .//*[@id='change-password']/div[1]/div/input
абсолютны xpaths
который содержит index
, Следовательно, они brittle
а также vulnerable
, Вы можете рассмотреть возможность создания уникальных logical xpath
,
Is above way the best way to test change password functionality?
:
Я не думаю, что есть лучшие практики в этом. Потому что это действительно зависит от того, что вы пытаетесь решить. Но определенно перед использованием sendKeys("abcd")
метод для текстового поля, вы должны рассмотреть возможность использования clear()
Метод первый.
- Когда есть
NoSuchElementException: Unable to locate element
мы должны рассмотреть возможностьExplicitWait
с надлежащимExpectedConditions
такSelenium
может найти элемент по крайней мере.
Дайте мне знать, если это отвечает на ваш вопрос.
Сначала попробуйте добавить фрагмент HTML, чтобы локаторы могли быть написаны гораздо более избыточным способом.
Во-вторых, используйте некоторый механизм ожидания для загрузки страницы должным образом. В вашем случае Вы нажимаете на ссылку и пытаетесь ввести данные в поле ввода пароля для смены, исключение, которое вы получаете из-за того, что страница загружена неправильно, и Selenium пытается ввести значение в поле для смены пароля.
Для простого решения вы можете использовать неявное ожидание, и оно будет работать
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);