Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

assertEquals + driver + кракозябры


(Алена Бартош) #1

Eclipse+Java+Unit4+Selenium

		String text = "{\"ok\":1,\"data\":[{\"city_id\":\"18539\",\"city_name\":\"\u0412\u0438\u043d\u043d\u0438\u0446\u0430\",\"countHotels\":\"20\",\"genitive\":\"\u0412\u0438\u043d\u043d\u0438\u0446\u044b\",\"rating\":\"13\",\"site_id\":\"5\",\"url\":\"?target=search&event=hotel&city_id=18539\"}],\"code\":200,\"msg\":\"ok\"}";
	String result = "{\"ok\":1,\"data\":[{\"city_id\":\"18539\",\"city_name\":\"Винница\",\"countHotels\":\"20\",\"genitive\":\"Винницы\",\"rating\":\"13\",\"site_id\":\"5\",\"url\":\"?target=search&event=hotel&city_id=18539\"}],\"code\":200,\"msg\":\"ok\"}";
	assertEquals(result, text);

Данные строки абсолютно равны и если запустить данный код тест пройдет успешно.
НО! Если тот же текст (text) в тех же кракозябрах забрать с драйвера тест проваливается.
assertEquals

expected:<...18539","city_name":"[Винница","countHotels":"20","genitive":"Винницы]","rating":"13","sit...> but was:<...18539","city_name":"[\u0412\u0438\u043d\u043d\u0438\u0446\u0430","countHotels":"20","genitive":"\u0412\u0438\u043d\u043d\u0438\u0446\u044b]","rating":"13","sit...>

Пробовала сравнивать через .getBytes(“UTF-8”). В результате получила.
text.getBytes(“UTF-8”) = [B@a893d5

result.getBytes(“UTF-8”)=[B@18195b3

Помогите, пожалуйста, справится с проблемой. Как сделать чтобы тест проходил нормально?


(Александр Таранков) #2
  1. какая кодировка в вашем Eclipse-проекте (Project > Properties > Resource > Text file encoding) и какая на странице, с которой вы получаете текст (Исходный html-код страницы > charset)?
  2. запуск теста делается из Eclipse?
  3. каким образом вы получаете текст и с какого элемента?

(Алена Бартош) #3
  1. Кодировка проекта и страницы UTF-8

  2. Тест запускаю из Eclipse

  3. Текст получаю со всей страницы с элемента body

    String text = driver.findElement(By.xpath("//body")).getText();

    String result = “{“ok”:1,“data”:[{“city_id”:“18539”,“city_name”:“Винница”,“countHotels”:“20”,“genitive”:“Винницы”,“rating”:“13”,“site_id”:“5”,“url”:”?target=search&event=hotel&city_id=18539"}],“code”:200,“msg”:“ok”}";

    assertEquals(result, text);

При стандартной кодировке текст отдается в кракозябрах. Нормально прочитать текст можно только с помощью дополнения JSONView.


(Maxim) #4

Странно, но в таком виде как у вас, у меня assertEquals() отрабатывает успешно.
Там же используется обычный Java метод equals(). А Java воспринимает эти две строчки абсолютно одинаковыми. Но судя по тому, что выводится в консоль, у вас Java это воспринимает как разные вещи, unicode не преобразовывает.
Может быть попробовать явное преобразование кодировок? Что-то типа String newTextStr= new String(text.getBytes("UTF-8"), "UTF-8");


(Александр Таранков) #5
  1. под каким браузером проверяете?
  2. попробуйте под другими браузерами?
  3. какая версия webdriver?
  4. в браузере страничка нормально отображается во время прогона теста?
  5. попробуйте ради эксперимента в Run Configuration вашего запуска в эклипс, в опции Java VM (по-моему вторая вкладка) добавить строчку -Dfile.encoding=UTF-8

Расскажите, что получилось?


(asolntsev) #6

У вас эта проблема с хромом?
Конкретно вот такая кракозября получается из-за бага в последней версии Chrome (30.0). Обещали исправить в следующей версии (31 или 32).


(Алена Бартош) #7
  1. Проверяю под Firefox 24.0
  2. Пробовала еще под Chrome 30.0 но результат тот же.
  3. webdriver - последняя версия.
  4. По сути текст отображается во всех браузерах одинаково не зависимо от кодировки.
    Нормально прочитать текст можно только подключив JSONView. Но как подключить JSONView при прогонке теста я не знаю :frowning:

(Алена Бартош) #8

Спасибо, теперь буду знать что в chrome лучше это не тестировать, но к сожалению проблема не только с ним, а и с остальными браузерами.


(asolntsev) #9

Не, вообще-то как раз в хроме лучше всего тестировать, так как он заметно быстрее других браузеров.