julia_v_iluhina

Untitled

Nov 1st, 2016
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.28 KB | None | 0 0
  1. http://joxi.ru/DrlQ5oLh4WlKkm
  2.  
  3. /*
  4.     мы реализуем проект на селениуме
  5.     селениде  - уже не нужно подключать
  6.     подправь pom
  7. */
  8. ****************************
  9.     public static Actions action(){
  10.         return new Actions(getDriver());
  11.     }
  12. /*
  13.     Метод корректнее назвать actions()
  14.     мы же создаем обїект типа Actions
  15. */
  16. *********************************
  17.  public static void setValue(WebElement element, String newTaskText) {
  18.          element.sendKeys(newTaskText+ Keys.ENTER);
  19.  }
  20. /*
  21.     setValue - это не только sendKeys
  22.     это еще и предварительная очистка текста вебэлемента (clear())
  23.  
  24.     и в качестве параметра sendKeys - мы должны использовать ровно то, что нам передали
  25.     а передали нам не newTaskText, а text or value - это универсальный метод
  26.     и про тексты тасок тут рассуждать не стоит
  27.     Keys.ENTER - не стоит добавлять
  28.     нажатие энтера - не входит в логику установки нового значения
  29.  
  30.     если метод setValue вызовут setValue(element, newTaskText + Keys.ENTER)
  31.     то будет как раз установить значение и нажать энтер
  32.  
  33.     а если вот так - setValue(element, newTaskText) - то только установим значение
  34.     а нажатие энтера или чего-то другого - это будет уже слежующей задачей
  35.     собственно, так и было ранее, когда мы в селениде это делали
  36. */
  37. ***************************************
  38.     public static By byClassName(String nameText){
  39.         return By.id(nameText);
  40.     }
  41. /*
  42.     реализация не соответствует имени)
  43.     да и не факт, что тебе нужен такой метод
  44. */
  45. ***********************************
  46.     public static By byTitle(String titleText){
  47.         return By.cssSelector(titleText);
  48.     }
  49. /*
  50.     странный метод тоже)
  51.     в прошлой работе такого же плана проблемы были
  52.     это я пропустила)
  53.  
  54.     $("[title='Sent Mail']")
  55.     $("[title~=Inbox]").click();
  56.  
  57.     вот так ты по тайтлу и ищешь
  58.  
  59.     выводы - или подправь неверные методы
  60.     или удали их, раз не используешь
  61.  
  62.     в прошлой работе тоже
  63.  
  64.     http://pastebin.com/wtSFZgSH
  65.     и про вот это тоже не забудь
  66. */
  67. **********************************
  68.  List<String> actualTexts = new ArrayList<String>();
  69.  for(WebElement element:listElements){
  70.     actualTexts.add(element.getText());
  71.  }
  72. /*
  73.     этот код используется в кондишенах не раз
  74.     реализуй универсальный метод
  75.     List<String> getTexts(List<WebElement> elements)
  76.     и его переиспользуй в кондишенах
  77.  
  78.     расположи такой метод в классе-контейнере универсальных статических методов Helpers
  79. */
  80. **********************************
  81.  public String toString() {
  82.     return String.format("\nTexts of list elements should be : %s\n while actual texts is: %s\n", actualTexts.toString(), Arrays.toString(expectedTexts));
  83.  }
  84. /*
  85.     все сообщения пересмотри в кондишенах
  86.     важно рассказать
  87.     что мы проверяем
  88.     для какого элемента/элементов мы проверяем
  89.     что ожидаем
  90.     что есть по факту
  91.  
  92.     тут было бы ок
  93.     texts of list elements found by locator ...
  94.     should be :
  95.     while actual texts is:
  96.  
  97.     обрати внимание - should be : - это проожидания (а не про факт)
  98.     посмотри - как строку строишь
  99.  
  100.     и про вывод локатора не забывай
  101.  
  102.     ну и не надо писать про тексты - если ищем не тексты, а что-то другое
  103.  
  104.     toString() всех реализованных кондишенов просмотри
  105. */
  106. ***********************************
  107. visibleTextsOf
  108. /*
  109.     сначала - получи список видимых элементов
  110.     потом - с помощью метода getTexts получи тексты видимых элементов
  111.  
  112.     получение списка видимых элементов - тоже используется несколько раз
  113.     это тоже стоит реализовать как метод в классе Helpers
  114. */
  115. ************************************
  116. sizeOfVisible
  117. /*
  118.     тут нам не нужно оперировать текстами элементов
  119.     достаточно получить список видимых вебэлементов
  120.     и его размер
  121.     Поскольку в toString - будешь оперировать фактическим размером списка
  122.     то на уровне класса-кондишена - объяви переменную actualSize
  123.     запоняй ее в apply
  124.     и выводи это значение в toString
  125.  
  126.     аналогично и для кондишена sizeOf
  127.     с той разницей - что тут оперируем всеми вебэлементами из списка
  128.     а не только видимыми
  129.  
  130.     кстати, полезнее, чтобы эти кондишены были
  131.     не ExpectedCondition<Boolean>
  132.     а ExpectedCondition<List<WebElement>>
  133.  
  134.     чтобы в случае успешной проверки
  135.     assertThat вернул не просто true
  136.     а список вебэлементов
  137. */
  138. ********************************
  139. public static ExpectedCondition<WebElement> listElementWithText(final By locator, final String expectedTexts) {
  140. /*
  141.     мы же ищем элемент с текстОМ, а не текстАМИ
  142.     подправь имя параметра expectedTexts
  143.  
  144.     тут, как и в texts
  145.     собери тексты элементов
  146.     и ими оперируй
  147.     и в apply
  148.     и в toString()
  149.  
  150.     List<WebElement> listElements; - объявляй и инициализируй в apply
  151.     т к только там и нужен этот список
  152.  
  153.     в toString() - нам ничего не даст его использование
  154.     listElements.toString() - мало информативно
  155.     в отличие от actualTexts.toString()
  156.  
  157.     не забывай про выражения toString()
  158.     выше описала - по какой схеме формулируй их
  159.     не надо писать о том, что ошибка - Element not found,...
  160.     опиши - что проверяешь, у какой сущности проверяешь, что ждешь и что получил по факту
  161.     так мы просто опишем наш кондишен
  162.     ведь toString() - это способ преобразования объекта к строке
  163.     а не текст ошибки
  164.     да, по факту, практически всегда toString() кондишена и вызывается в сообщении об ошибке при
  165.     не выполнении проверки new WebDriverWait(...).until(...)
  166.     но все равно надо быть корректным
  167.     toString() - это метод, описывающий объект, приводящий объект к строке
  168.     и технически - некорректно строить фразы про то, что у нас ошибка и т п
  169.     корректно - описать наш кондишен
  170.  
  171. */
  172. *******************************
  173.   public static ExpectedCondition<WebElement> listElementByCssClas(final By locator, final String expectedCssClass) {
  174.   /*
  175.     в имени кондишена букву потерял
  176.     не Clas
  177.     а  Class
  178.  
  179.   */
  180.  
  181.         return elementExceptionsCatcher(new ExpectedCondition<WebElement>() {
  182.             List<WebElement> listElements;
  183.             /*
  184.                 этот список нужен только в apply
  185.                 вот там его и объявляй
  186.             */
  187.             List<String> listCssClass = new ArrayList<>();
  188.             /*
  189.                 не корректное название списка
  190.                 по сути - это значения атрибута class
  191.                 а не  css классы
  192.  
  193.                     Имя элемента и его классы
  194.                     в выражении
  195.                     <element class=“green bold”>
  196.                     element - имя элемента
  197.                     class -  имя атрибута
  198.                     “green bold” - значение атрибута class
  199.                     green - цсс класс элемента element
  200.                     bold - еще один цсс класс элемента element
  201.  
  202.                 classAttributes, classList - корректнее
  203.                 (главное слово - последнее)
  204.                 https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.ubyujhyxdfwd
  205.             */
  206.             public WebElement apply(WebDriver driver) {
  207.                ...
  208.  
  209.                     if (listCssClass.get(i).contains(expectedCssClass)) {
  210.                     /*
  211.                         не верно проверять на вхождение
  212.                         например у элемента классы = "active editing"
  213.                         мы проверяем этот кондишен для класса "edit"
  214.  
  215.                         при вот так реализованном кондишене - проверка пройдет
  216.                         хотя не должна была
  217.  
  218.                         нам надо значение атрибута class
  219.                         разбить на слова (по пробелам)
  220.                         и если в этом перечне слов будет слово, в точности равное искомому классу
  221.                         то вот тогда - ок, проверка прошла
  222.                     */
  223. ***********************************************
  224. public class ToDoMvcPage {
  225.  
  226.     public WebDriver driver;
  227.     public ToDoMvcPage(){
  228.         driver = getDriver();
  229.     }
  230. /*
  231.     даже если организуешь пейдж-объект
  232.     уже не нужно делать ему поле-вебдрайвер
  233.  
  234.     ведь ты и из пейджа можешь вызвать getDriver()
  235.  
  236.     нет никаких сложностей или препятствий - организовать пейдж как пейдж-модуль
  237.     на этом настаивать не буду
  238.  
  239.     но вот конструктор и поле driver - в любом случае лишние
  240. */
  241. *************************************
  242. public static void   edit(String oldTaskText, String newTaskText) {
  243. public static void   cancelEdit(String oldTaskText, String newTaskText) {
  244. /*
  245.     за счет изменений в реализации setValue - код станет на одну строчку короче
  246.  
  247.     да и давай эти методы DRY реализуем
  248.  
  249.     как и для селедиде проекта
  250.     реализуй метод WebElement startEdit(String oldTaskText, String newTaskText)
  251.     в котором будут все общие для этих методов действия
  252.     и возвращать будешь элемент - в котором вводил новое значение
  253.  
  254.     а если еще и setValue будет возвращать WebElement
  255.     так и в startEdit сможешь код поаккуратнее написать)
  256. */
  257. ***********************
  258. public class GMailTest extends BaseTest {
  259.     @BeforeClass
  260.     public static void config() {
  261.         Configuration.timeout = 15;
  262.     }
  263. /*
  264.     начало слегка озадачило)
  265.  
  266.     почему GMailTest? )
  267.  
  268.     да и таймаута стандартного в 4 секунды нам должно хватить с головой)
  269. */
  270.     public static  void visit(){ open("https://todomvc4tasj.herokuapp.com/");}
  271. /*
  272.     такому методу - место в пейдже
  273.     или - если такой метод оставлять в тест-классе
  274.     его нужно аннотировать как @BeforeClass
  275.     и уже в тест-методах не вызывать
  276. */
  277. ****************************************
  278. public class BaseTest {
  279.  
  280.     @Before
  281.     public  void createDriver() {
  282.         setDriver(new FirefoxDriver());
  283.     }
  284.  
  285.  
  286.     @After
  287.     public  void quit() {
  288.         getDriver().quit();
  289.     }
  290.  
  291.  
  292. }
  293. /*
  294.     если для каждого тест-метода использовать свой вебдрайвер
  295.     тогда конечно - и чистить локалсторидж не нужно)
  296.  
  297.     все верно)
  298.  
  299.     но если ты запускаешь тесты в одном потоке - это роскошь - для каждого тест-метода создавать свой вебдрайвер
  300.     гораздо экономичнее в таком случае использовать
  301.     не @Before и @After методы
  302.     а @BeforeClass и @AfterClass методы
  303.  
  304.     ну и про очистку локалсториджа надо будет подумать (уже в тест-классе)
  305.  
  306.     про параллельный запуск - следующая работа
  307.     там как раз понадобится вариант с @Before и @After методами
  308. */
Advertisement
Add Comment
Please, Sign In to add comment