t.me/atinfo_chat Telegram группа по автоматизации тестирования

Изменить TimeZone в Chrome или любом другом браузере

protractor
configuration
java
selenium
webdriver
Теги: #<Tag:0x00007f21d2a111c0> #<Tag:0x00007f21d2a11080> #<Tag:0x00007f21d2a10f40> #<Tag:0x00007f21d2a10e00> #<Tag:0x00007f21d2a10cc0>

(Vitalii Budniak) #1

Использую Protractor. Никак не могу изменить Timezone в барузере. Что можно сделать?

Вот так не работает
  capabilities: {
    'browserName': 'chrome',
    'time-zone': 'New_York',
  }

, и вообще параметр time-zone не воспринимается.


(Сергей Кузьмин) #2

https://sites.google.com/a/chromium.org/chromedriver/capabilities#TOC-List-of-recognized-capabilities что те нигде нету timezone


(Vitalii Budniak) #3

Да нету). Я вот ищу любой другой вариант что б запустить браузер в другой Таймзоне


(Сергей Кузьмин) #4

@ Vitalii_Budniak выставить
system time zone на уровне контейнера вас устроит ?
пишут никак по другому не получается https://www.blackhatworld.com/seo/fake-system-time-in-selenium-chromedriver.949581/


(Сергей Кузьмин) #5

реверс-инжениринг change-timezone расширения хрома думаю будет сложнее он повидимому полностью переопределяет

  const {
    toJSON, getYear, getMonth, getHours, toString, getMinutes, getSeconds, getUTCMonth, getFullYear, getUTCHours,
    getUTCFullYear, getMilliseconds, getTimezoneOffset, getUTCMilliseconds, toLocaleTimeString, toLocaleDateString,
    toISOString, toGMTString, toUTCString, toTimeString, toDateString, getUTCSeconds, getUTCMinutes, toLocaleString,
    getDay, getUTCDate, getUTCDay, getDate
  } = Date.prototype;

в своем фрейме

chrome.webNavigation.onCommitted.addListener(function (details) {
  if (config.addon.state === "ON") {
    var code = config.options;
    app.tab.inject(details.tabId, {
      "allFrames": false,
      "matchAboutBlank": true,
      "runAt": "document_start",
      "frameId": details.frameId,
      "code": "var timeZoneStorage = " + JSON.stringify(config.options.timezone) + ';'
    }, {
      "allFrames": false,
      "matchAboutBlank": true,
      "runAt": "document_start",
      "frameId": details.frameId,
      "file": "/data/content_script/inject.js"
    });
  }
});


знатоки хром расширений могут посоветовать лучше


(Vitalii Budniak) #6

Спс. Контейнер решение рабочее но такео себе. Как временное решение можно использовать puppeteer и просто передать переменную среды
env: { TZ: 'America/New_York', }

Но на Ubuntu 18 есть проблема запуска headless: false и
env: { TZ: 'America/New_York', }
Error - (node:25380) UnhandledPromiseRejectionWarning: Error: Failed to launch chrome!
(chrome:25394): Gtk-WARNING: 04:46:28.183: cannot open display.

Если же запускать без переменной среды или headless: true тогда норм…


(Сергей Кузьмин) #7

натурально если не headless - просит но не находит DISPLAY - запустите X - есть много способов напр http://manpages.ubuntu.com/manpages/trusty/man1/xvfb-run.1.html
это никак с переопределением TZ не связано


(Vitalii Budniak) #8

но если убрать TZ (переменную среды env) и headless: false тогда все окей, окно откроет и все запускать без ошибок. Вот почему подумал что проблема в связке переменной среды и headless: false (т.е. открыть окно)


(Сергей Кузьмин) #9

расшарьте код попробовать.


(Vitalii Budniak) #10

Все просто. Создайте себе фолдер (чтобы потом все удалить одним кликом).

  1. Выполните в терминале npm install --save puppeteer (110-115 mb установка node_modules)
  2. Создайте файл например test.js со следующим содержанием:
async function run() {
  const browser = await puppeteer.launch({
    headless: false,
    env: {
      TZ: "America/New_York"
    },
    defaultViewport: null,
    args: ["--window-size=1900,1200"]
  });
  const page = await browser.newPage();
  await page.goto("https://whoer.net/ru");
  await page.waitFor(10000);
  await page.screenshot({ path: "screenshots/testSite.png" });
  browser.close();
}

run();

(await page.screenshot можно убрать, но если без окна запускать то можно проверить на скрине что работает и открылся сайт)

  1. Запустить можно командой в терминале: node test.js

Этот пример не работает на Ubuntu. Но работает на MacOS и Windows 7


(Сергей Кузьмин) #11

@ Vitalii_Budniak а в чем отличие от стандартной chrome, X, selenium комбинации?


(Vitalii Budniak) #12

Не совсем понял вопрос о комбинациях и Х.

Но puppeteer работает напрямую с браузером Chomium (по сути тот же Хром) без веб драйвера Selenium и он может принимать env - где можно нормально задать TZ. И кстати puppeteer работает только с Хром и больше ничего не поддерживает

Беда в том, что Selenium (и Protractor) не поддерживает изменений тайм зоны и не возможно передать переменную среды env: {TZ.......} чтоб запустить фактически на уровне процесса тайм зону.

@sergueik я так понимаю у вас также не запустился скрипт с headless: false + env ?


(Сергей Кузьмин) #13

имеется в виду plain Selenium (не CDP) , chrome / chromium , xvfb или другой Х сервер


(годится не только для bionic)

sudo ln -fs /usr/share/zoneinfo/UTC /etc/localtime
timedatectl 
// скажет чтл UTC*




потом запускаем локально или через hub
https://whoer.net
говорит что я в UTC
чтобы изменит надо убивать хаб


(Vitalii Budniak) #14

Меня только локально интересует. Спс попробуюю сегодня-завтра


(Сергей Кузьмин) #15

я запускал в виртуалбоксе - не самое быстрое решение но хоть что то чтоб попробовать. Chrome Devtoool наверное можно почитать как они делают возможным замену timezone .


(Vitalii Budniak) #16

Печалька https://bugs.chromium.org/p/chromium/issues/detail?id=993628


(Сергей Кузьмин) #17

здорово - ну так делайте без расчета на cdp может быть. кстати интересно что это вдруг так важно fake TZ ?


(Vitalii Budniak) #18

Есть фича на проекте, которая будет работать коректно, только если будет определенная таймзона (таймзона в браузере на клиенте)


(Alexandr D.) #19

Вариант с контейнером докера не рассматриваем?

Можно взять селенойдовский образ с хромом и добавить в него приём параметра - нужную таймзону.

Тогда можно нужные тесты гонять в нём… и всё.


(Сергей Кузьмин) #20

@ NoksaAlexandr D. - докер или full scale VM - это тот способ который я предложил @ Vitalii_Budniak. разницы в селениум части стека нет. а вот интересно можно ли прикрутить nbofeaabhknfdcpoddmfckpokmncimpj timeShiftInject
??

[

Change Timezone (Time Shift) - Chrome interneta veikals
https://chrome.google.com › change-timezone-time-shif
](https://chrome.google.com/webstore/detail/change-timezone-time-shif/nbofeaabhknfdcpoddmfckpokmncimpj?type=ext&hl=lv&itemlang=ta) - Translate this page
Easily change your timezone to a desired value