Перейти к содержимому

Фотография

Передача даты в поле

selenium java IDEA

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 25

#1 holydiverinc

holydiverinc

    Новый участник

  • Members
  • Pip
  • 25 сообщений
  • ФИО:Владимир Черный
  • Город:Киев

Отправлено 02 октября 2015 - 12:13

Такое дело. Тест Проходит нормально, но не выполняется одно условие: не передается определенная дата. 

Вот сам код, в комментариях указано где что должно делаться.

Программист сайта сказал как это делает он, но у него C#. 

$('#dateGo').val(str)

Подскажите, где я не прав.

package com.holydiverinc.webdriver;


import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.concurrent.TimeUnit;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;


public class YTTrainSearchDate {
    private WebDriver driver;
    private String baseUrl;
    private boolean acceptNextAlert = true;
    private StringBuffer verificationErrors = new StringBuffer();

    @Before
    public void setUp() throws Exception {
                FirefoxProfile profile = new ProfilesIni().getProfile("Webdriver");
        driver = new FirefoxDriver(profile);
        baseUrl = "https://yt.ua";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Test
    public void testYTTrainSearch() throws Exception {
        Calendar c = new GregorianCalendar();
        c.add(Calendar.DAY_OF_YEAR, 4); // увеличиваем на 4 дня от текущей даты
        SimpleDateFormat format1 = new SimpleDateFormat("dd.MM.yyyy"); //придаем нужный формат дате
        String str = format1.format(c.getTime());//c.getTime().toString();//вытягиваем измененную дату в нужном формате и присваиваем переменной
        driver.get(baseUrl + "/ru");
        driver.findElement(By.xpath("//div[@id='ytLogin']")).click();
        driver.findElement(By.xpath("(//input[@type='text'])[4]")).clear();
        driver.findElement(By.xpath("(//input[@type='text'])[4]")).sendKeys("info@yt.ua");
        driver.findElement(By.xpath("(//input[@type='password'])[2]")).clear();
        driver.findElement(By.xpath("(//input[@type='password'])[2]")).sendKeys("111111Qq");
        driver.findElement(By.cssSelector("#ytAuthByLogin > button.yt-button-dark-brown.gradient")).click();
        assertEquals("info@yt.ua", driver.findElement(By.xpath("//span[@id='globalStateLine']")).getText());
        driver.findElement(By.xpath("//table[@id='userMenu']/tbody/tr/td/a/img")).click();
        driver.findElement(By.xpath("//div[@id='railwaySearchForm']/div/div[2]/label/span")).click();
        driver.findElement(By.id("depStation")).clear();
        driver.findElement(By.id("depStation")).sendKeys("\u043a\u0438\u0435"); //Киев
        driver.findElement(By.id("depStation")).sendKeys(Keys.DOWN);
        driver.findElement(By.id("ui-id-3")).click();
        driver.findElement(By.xpath("//input[@id='dateGo']")).sendKeys(str);// ТУТ ДОЛЖНО ПЕРЕДАВАТЬ НУЖНУЮ ДАТУ, но оставляет текущую
        driver.findElement(By.id("arrStation")).clear();
        driver.findElement(By.id("arrStation")).sendKeys("\u041b\u042c\u0412\u0406\u0412"); //Львов
        driver.findElement(By.id("arrStation")).sendKeys(Keys.DOWN);
        driver.findElement(By.id("ui-id-13")).click();
        driver.findElement(By.cssSelector("button.yt-button-dark-brown.gradient")).click();

    }

    @After
    public void tearDown() throws Exception {
        driver.quit();
        String verificationErrorString = verificationErrors.toString();
        if (!"".equals(verificationErrorString)) {
            fail(verificationErrorString);
        }
    }

    private boolean isElementPresent(By by) {
        try {
            driver.findElement(by);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }

    private boolean isAlertPresent() {
        try {
            driver.switchTo().alert();
            return true;
        } catch (NoAlertPresentException e) {
            return false;
        }
    }

    private String closeAlertAndGetItsText() {
        try {
            Alert alert = driver.switchTo().alert();
            String alertText = alert.getText();
            if (acceptNextAlert) {
                alert.accept();
            } else {
                alert.dismiss();
            }
            return alertText;
        } finally {
            acceptNextAlert = true;
        }
    }
}

  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 02 октября 2015 - 12:15

Если на поле даты стоит readonly="readonly"

то только через js или пишите обработку для календарика


  • 1

#3 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 02 октября 2015 - 12:46

c.add(Calendar.DAY_OF_YEAR, 4);
а разве не так:
c = c.add(Calendar.DAY_OF_YEAR, 4);
Ну или, если текущую дату надо сохранить,
Calendar cNew = c.add(Calendar.DAY_OF_YEAR, 4);
...
String str = format1.format(cNew.getTime());

  • 1

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#4 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 02 октября 2015 - 12:55

а разве не так:
c = c.add(Calendar.DAY_OF_YEAR, 4);

 

 

что это ?

add -  это булеан или воид

с - календарь

с присвоить булеан или воид...


  • 0

#5 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 02 октября 2015 - 12:59

ох уж эти ваши джавы :)

 

в C# Add возвращает новую дату :)

 

Да и потом, признаки именно того, что я прав) ибо ввести получается и вводится старая дата ;)


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#6 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 02 октября 2015 - 13:01

http://www.tutorials...alendar_add.htm - нда, тут я бессилен)

 

Вот поэтому Саша и не женится (ц)

Вот поэтому Витя пишет на C# ;)


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#7 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 02 октября 2015 - 13:07


Да и потом, признаки именно того, что я прав) ибо ввести получается и вводится старая дата ;)

 

Нет, код

 Calendar c = new GregorianCalendar();
         c.add(Calendar.DAY_OF_YEAR, 4); // увеличиваем на 4 дня от текущей даты
         SimpleDateFormat format1 = new SimpleDateFormat("dd.MM.yyyy"); //придаем нужный формат дате
         String str = format1.format(c.getTime());

Тут str будет 06.10.2015

 

Т.е. проблема именно с инпут полем

Скорей всего стоит readonly="readonly"

 

Т.е. либо работать через js, либо писать код для работы с календариком


  • 1

#8 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 02 октября 2015 - 13:09

 


Да и потом, признаки именно того, что я прав) ибо ввести получается и вводится старая дата ;)

 

Нет

 

Да я уже погуглил, увидел, что неправ)


  • 2

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#9 holydiverinc

holydiverinc

    Новый участник

  • Members
  • Pip
  • 25 сообщений
  • ФИО:Владимир Черный
  • Город:Киев

Отправлено 02 октября 2015 - 15:06

 


Да и потом, признаки именно того, что я прав) ибо ввести получается и вводится старая дата ;)

 

Нет, код

 Calendar c = new GregorianCalendar();
         c.add(Calendar.DAY_OF_YEAR, 4); // увеличиваем на 4 дня от текущей даты
         SimpleDateFormat format1 = new SimpleDateFormat("dd.MM.yyyy"); //придаем нужный формат дате
         String str = format1.format(c.getTime());

Тут str будет 06.10.2015

 

Т.е. проблема именно с инпут полем

Скорей всего стоит readonly="readonly"

 

Т.е. либо работать через js, либо писать код для работы с календариком

 

Таки да, там стоит readonly="readonly". И вот тут я немного приуныл. js коекак знаю, но что куда - далек от истины. А Код для работы с календариком это как?)


  • 0

#10 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 02 октября 2015 - 15:23

Таки да, там стоит readonly="readonly". И вот тут я немного приуныл. js коекак знаю, но что куда - далек от истины. А Код для работы с календариком это как?

 

 

 

при клике на инпут должен появляться datepicker из которого ты выбираешь число/месяц/год в отдельной форме

 

лично я делал это следующим образом:

1.брал текущую дату

2.отделял число/месяц/год

3.Выбирал каждое число из соответствующих полей


  • 1

#11 holydiverinc

holydiverinc

    Новый участник

  • Members
  • Pip
  • 25 сообщений
  • ФИО:Владимир Черный
  • Город:Киев

Отправлено 02 октября 2015 - 19:47

Буду делать так:

1. Взять текущую дату. (02.10.2015)

2. Сохраню переменные int d0 = 02, m0 = 10; y=2015

3. Получу новую дату (+4) ==> 06.10.2015

4. Сохраню переменные int d1 = 06, m1 = 10; y=2015

5. Сравниваю переменные.

    если m1 == m0 и/или (еще не определился) y1 == y0, тогда пункт 6

    иначе перелистнуть календарь на следующий месяц и пункт 6.

6. кликнуть на линк числа (d1).

 

Написал пока алгоритм, чтоб не забыть. Код буду писать позже, так, как только начинающий.

 

У кого какие замечания/предложения?


  • 0

#12 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 03 октября 2015 - 13:34

Имхо, год проверять не надо, если виджет нормальный и при перелистывании с декабря на январь меняет год)
  • 1

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#13 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 03 октября 2015 - 17:57

Вот здесь описано, как вставить дату в поле ввода, с которым связан виджет-календарик:

http://barancev.gith...tepicker-value/


  • 2
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#14 holydiverinc

holydiverinc

    Новый участник

  • Members
  • Pip
  • 25 сообщений
  • ФИО:Владимир Черный
  • Город:Киев

Отправлено 05 октября 2015 - 11:18

 

Имхо, год проверять не надо, если виджет нормальный и при перелистывании с декабря на январь меняет год)

таки да, там и месяц то проверять не надо. Это достигается простым сравнением двух дат (чисел месяца) и если enterDate больше currentDate, тогда кликать, если нет, перелистывать на след. месяц и потом кликать.

 

НО!

 

Выход нашелся неожиданно просто! Календарь ловит нажатия клавиш. Поэтому я просто передал 4 раза

driver.findElement(By.xpath("//input[@id='dateGo']")).sendKeys(Keys.ARROW_RIGHT);

а потом

driver.findElement(By.xpath("//input[@id='dateGo']")).sendKeys(Keys.ENTER);

и вуаля! календарь схавал дату и тест пошел дальше)


  • 0

#15 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 05 октября 2015 - 11:45

 

 

Имхо, год проверять не надо, если виджет нормальный и при перелистывании с декабря на январь меняет год)

таки да, там и месяц то проверять не надо. Это достигается простым сравнением двух дат (чисел месяца) и если enterDate больше currentDate, тогда кликать, если нет, перелистывать на след. месяц и потом кликать.

 

НО!

 

Выход нашелся неожиданно просто! Календарь ловит нажатия клавиш. Поэтому я просто передал 4 раза

driver.findElement(By.xpath("//input[@id='dateGo']")).sendKeys(Keys.ARROW_RIGHT);

а потом

driver.findElement(By.xpath("//input[@id='dateGo']")).sendKeys(Keys.ENTER);

и вуаля! календарь схавал дату и тест пошел дальше)

 

Таки это костыль :( а если потом понадобится увеличить год на 1? 365 раз тыкать будешь? а если 1 год, 2 месяца и 3 дня? а если точную дату задать?)

Мне очень понравилось решение Алексея)


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#16 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 06 октября 2015 - 11:09

Мне понадобилось вытащить данные из календаря... а там такое:
20151006-iwet-24kb.jpg

Покумекал-покумекал и решил тягать время из БД...


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#17 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 06 октября 2015 - 11:19

Сильно... Вместо того, что бы взять проперти value у input'a - костылить с БД :)
  • 0

#18 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 06 октября 2015 - 11:24

Было бы ещё это свойство у IWebElement)

есть свойство Text, но оно пустое...

Решил всё-таки использовать 

js.ExecuteScript("$("#TimeStart").val()");

только у меня что-то JavaScriptExecutor не находится... AsyncJavaScriptExecutor есть, а JavaScriptExecutor нету Оо


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#19 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 06 октября 2015 - 11:29

http://selenium.goog...va.lang.String-
 

More exactly, this method will return the value of the given attribute, unless that attribute is not present, in which case the value of the property with the same name is returned (for example for the "value" property of a textarea element).


  • 1

#20 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 06 октября 2015 - 12:30

Атрибута value не увидел - думал, не прокатит. Но прокатило. Спасибо.


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©




Темы с аналогичным тегами selenium, java, IDEA

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных