julia_v_iluhina

Untitled

Nov 2nd, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.00 KB | None | 0 0
  1. /*
  2.     я бы на твоем месте использовала селениум версии 2.53.1
  3.     с фф 47.0.1 - работает ок
  4.  
  5.     к делу это не относится
  6.     просто по пути
  7. */
  8. *********************
  9. public class BaseTest {
  10.  
  11.     @BeforeClass
  12.     public static  void createDriver() {
  13.         setDriver(new FirefoxDriver());
  14.     }
  15.  
  16.  
  17.     @AfterClass
  18.     public static void quit() {
  19.         getDriver().quit();
  20.     }
  21. }
  22. /*
  23.     еще изменения просто по пути
  24.     советую перейти на @BeforeClass и @AfterClass методы
  25.  
  26.     чтоб для всех тест-методов тест-класса мы создавали браузер лишь единожды
  27.  
  28.     пока ты не делаешь параллельного запуска тестов (это будешь делать в следующем задании)
  29.     можно экономить свое время - на открытиях-закрытиях браузера
  30. */
  31. *************************
  32. public class ToDoMvcTest extends BaseTest {
  33.  
  34.     @Before
  35.     public void openUrl(){ visit();}
  36.  
  37.     @After
  38.     public void clear() {
  39.         ((JavascriptExecutor) getDriver()).executeScript("localStorage.clear()");
  40.     }
  41. /*
  42.     если все тесты будут запускаться в одном браузере - придется очищать локалсторидж
  43.  
  44.     организуй в ConciseAPI - executeJavaScript
  45.     и тут - используй его
  46.  
  47.     это все еще - просто по пути
  48.     к заявленной тобой проблеме - это не относится
  49. */
  50. ********************************************
  51.     public static void add(String... taskTexts) {
  52.         for (String text : taskTexts) {
  53.             setValue($(elementToBeClickable(byCss("#new-todo"))), text + Keys.ENTER);
  54.         }
  55.     }
  56. /*
  57.     еще по пути
  58.     у меня наблюдались такие проблемки
  59.  
  60.     что при при добавлении тасок (чаще - двух подряд)
  61.     либо таски не добавляются по нажатию энтер
  62.     либо вместо добавленных 0 и 4
  63.     добавляется одна = 04
  64.  
  65.     тут 2 проблемки
  66.     первая - то что при нажатии энтера в поле "#new-todo" - таска не добавляется
  67.     (не факт, что у тебя это проявилось, но вполне возможно  - что да
  68.     зависит и от скорости инета)
  69.     эта проблема из-за самой реализации нашего приложения todoMVC
  70.     страница открывается, поля доступны для работы
  71.     а их джаваскрипты еще не подгрузились
  72.     и если в этот момент мы успеваем ввести значение в "#new-todo" и нажать энтер
  73.     то увы - таска не добавится
  74.  
  75.     ты в своей версии вызывал $ - который ждал видимости поля
  76.     я использовала другой кондишен (стандартный) который проверяет - что поле уже работает
  77.     это решило проблему - мы дожидаемся корректного повеения поля "#new-todo"
  78.  
  79.  
  80.    вторая проблемка - когда текст новой таски добавляется в поле  "#new-todo"
  81.    к тексту ранее добавляемой таски
  82.  
  83.    у тебя был вариант с sendKeys
  84.    в принципе - после нажатия энтер - таска должна добавиться и поле "#new-todo" очиститься
  85.  
  86.    но вот я наблюдала - что текст второй таски мы раньше добавляем, чем это происходит
  87.    решение - использовать не sendKeys, а setValue
  88.  
  89.    вот после таких изменений все нестабильные ошибки - ушли
  90.    не знаю - возможно у тебя это все и не проявлялось
  91.    но - в любом случае - будет полезно понимать - как с подобным бороться можно
  92.  
  93.  
  94.    это тоже пока еще по пути)
  95. */
  96. ****************************
  97. public static ExpectedCondition<WebElement> listElementByCssClass(final By locator, final String expectedCssClass) {
  98.  
  99.    ...
  100.                 for(int i = 0; i < listElements.size(); i++ ) {
  101.                     String[] actualClass = classAttributes.get(i).split("\\s");
  102.                     for( int j = 0; j < actualClass.length - 1; j++ ) {
  103.                         if (expectedCssClass.equals(actualClass[j]) || expectedCssClass.equals(actualClass[j+1])) {
  104.                             return listElements.get(j);
  105.                         }
  106.                     }
  107. /*
  108.     собственно - ошибка крылась вот в этом коде
  109.     во внутреннем цикле - ты оперировал счетчиком  j (for можно переписать проще)
  110.     и внутри цикла проверял на равенство expectedCssClass и очередное слово (так сложно - из-за условия в for)
  111.     и когда находил j-ый класс совпадающий - то возвращал  j-ый вебэлемент
  112.     (j-ый - это не тот элемент, с которым мы работаем, мы работаем с i-ым элементом)
  113.  
  114.     идем по пути последовательных упрощений этого кода
  115. */
  116.                 for(int i = 0; i < listElements.size(); i++ ) {
  117.                     String[] actualClass = classAttributes.get(i).split("\\s");
  118.                     for( int j = 0; j < actualClass.length; j++ ) {//поправили условие в for
  119.                         if (expectedCssClass.equals(actualClass[j])) {//потому - смогли упростить условие в if
  120.                             return listElements.get(i);//вернули элемент, классы которого анализируем
  121.                         }
  122.                 }
  123. /*
  124.     Следующее упрощение
  125.     мы спокойно можем обойтись и без счетчика j
  126. */
  127.                 for(int i = 0; i < listElements.size(); i++ ) {
  128.                     String[] actualClass = classAttributes.get(i).split("\\s");
  129.                     for(String actualCssClass:actualClass ) {//конечно - actualClass - для массива название не очень, но пусть пока так
  130.                         if (expectedCssClass.equals(actualCssClass)) {
  131.                             return listElements.get(i);
  132.                         }
  133.                 }
  134. /*
  135.     И последний вариант упрощения
  136.     можно вообще избавиться от перебора классов
  137.  
  138.     мы массив actualClass - можем преобразовать в список строк -
  139.     Arrays.asList(classAttributes.get(i).split("\\s"))
  140.  
  141.     у списка есть метод contains - который проверяет - есть ли в списке элемент РАВНЫЙ переданному
  142.     что нам и нужно)
  143. */
  144.                 if (Arrays.asList(classAttributes.get(i).split("\\s")).contains(expectedCssClass)) {
  145.                     return listElements.get(i);
  146.                 }
  147. /*
  148.     мне последний вариант - кажется максимально разумным
  149.     на нем - не настаиваю
  150.    
  151.     можешь остановиться на вариантах с циклом - если они понятнее
  152. */
Advertisement
Add Comment
Please, Sign In to add comment