Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- я бы на твоем месте использовала селениум версии 2.53.1
- с фф 47.0.1 - работает ок
- к делу это не относится
- просто по пути
- */
- *********************
- public class BaseTest {
- @BeforeClass
- public static void createDriver() {
- setDriver(new FirefoxDriver());
- }
- @AfterClass
- public static void quit() {
- getDriver().quit();
- }
- }
- /*
- еще изменения просто по пути
- советую перейти на @BeforeClass и @AfterClass методы
- чтоб для всех тест-методов тест-класса мы создавали браузер лишь единожды
- пока ты не делаешь параллельного запуска тестов (это будешь делать в следующем задании)
- можно экономить свое время - на открытиях-закрытиях браузера
- */
- *************************
- public class ToDoMvcTest extends BaseTest {
- @Before
- public void openUrl(){ visit();}
- @After
- public void clear() {
- ((JavascriptExecutor) getDriver()).executeScript("localStorage.clear()");
- }
- /*
- если все тесты будут запускаться в одном браузере - придется очищать локалсторидж
- организуй в ConciseAPI - executeJavaScript
- и тут - используй его
- это все еще - просто по пути
- к заявленной тобой проблеме - это не относится
- */
- ********************************************
- public static void add(String... taskTexts) {
- for (String text : taskTexts) {
- setValue($(elementToBeClickable(byCss("#new-todo"))), text + Keys.ENTER);
- }
- }
- /*
- еще по пути
- у меня наблюдались такие проблемки
- что при при добавлении тасок (чаще - двух подряд)
- либо таски не добавляются по нажатию энтер
- либо вместо добавленных 0 и 4
- добавляется одна = 04
- тут 2 проблемки
- первая - то что при нажатии энтера в поле "#new-todo" - таска не добавляется
- (не факт, что у тебя это проявилось, но вполне возможно - что да
- зависит и от скорости инета)
- эта проблема из-за самой реализации нашего приложения todoMVC
- страница открывается, поля доступны для работы
- а их джаваскрипты еще не подгрузились
- и если в этот момент мы успеваем ввести значение в "#new-todo" и нажать энтер
- то увы - таска не добавится
- ты в своей версии вызывал $ - который ждал видимости поля
- я использовала другой кондишен (стандартный) который проверяет - что поле уже работает
- это решило проблему - мы дожидаемся корректного повеения поля "#new-todo"
- вторая проблемка - когда текст новой таски добавляется в поле "#new-todo"
- к тексту ранее добавляемой таски
- у тебя был вариант с sendKeys
- в принципе - после нажатия энтер - таска должна добавиться и поле "#new-todo" очиститься
- но вот я наблюдала - что текст второй таски мы раньше добавляем, чем это происходит
- решение - использовать не sendKeys, а setValue
- вот после таких изменений все нестабильные ошибки - ушли
- не знаю - возможно у тебя это все и не проявлялось
- но - в любом случае - будет полезно понимать - как с подобным бороться можно
- это тоже пока еще по пути)
- */
- ****************************
- public static ExpectedCondition<WebElement> listElementByCssClass(final By locator, final String expectedCssClass) {
- ...
- for(int i = 0; i < listElements.size(); i++ ) {
- String[] actualClass = classAttributes.get(i).split("\\s");
- for( int j = 0; j < actualClass.length - 1; j++ ) {
- if (expectedCssClass.equals(actualClass[j]) || expectedCssClass.equals(actualClass[j+1])) {
- return listElements.get(j);
- }
- }
- /*
- собственно - ошибка крылась вот в этом коде
- во внутреннем цикле - ты оперировал счетчиком j (for можно переписать проще)
- и внутри цикла проверял на равенство expectedCssClass и очередное слово (так сложно - из-за условия в for)
- и когда находил j-ый класс совпадающий - то возвращал j-ый вебэлемент
- (j-ый - это не тот элемент, с которым мы работаем, мы работаем с i-ым элементом)
- идем по пути последовательных упрощений этого кода
- */
- for(int i = 0; i < listElements.size(); i++ ) {
- String[] actualClass = classAttributes.get(i).split("\\s");
- for( int j = 0; j < actualClass.length; j++ ) {//поправили условие в for
- if (expectedCssClass.equals(actualClass[j])) {//потому - смогли упростить условие в if
- return listElements.get(i);//вернули элемент, классы которого анализируем
- }
- }
- /*
- Следующее упрощение
- мы спокойно можем обойтись и без счетчика j
- */
- for(int i = 0; i < listElements.size(); i++ ) {
- String[] actualClass = classAttributes.get(i).split("\\s");
- for(String actualCssClass:actualClass ) {//конечно - actualClass - для массива название не очень, но пусть пока так
- if (expectedCssClass.equals(actualCssClass)) {
- return listElements.get(i);
- }
- }
- /*
- И последний вариант упрощения
- можно вообще избавиться от перебора классов
- мы массив actualClass - можем преобразовать в список строк -
- Arrays.asList(classAttributes.get(i).split("\\s"))
- у списка есть метод contains - который проверяет - есть ли в списке элемент РАВНЫЙ переданному
- что нам и нужно)
- */
- if (Arrays.asList(classAttributes.get(i).split("\\s")).contains(expectedCssClass)) {
- return listElements.get(i);
- }
- /*
- мне последний вариант - кажется максимально разумным
- на нем - не настаиваю
- можешь остановиться на вариантах с циклом - если они понятнее
- */
Advertisement
Add Comment
Please, Sign In to add comment