如何在 Selenium Chromedriver 中设置时区?

Posted

技术标签:

【中文标题】如何在 Selenium Chromedriver 中设置时区?【英文标题】:How do I set a timezone in Selenium Chromedriver? 【发布时间】:2017-11-25 01:33:31 【问题描述】:

我不知道在使用 Chromedriver 时如何设置时区。是否有一些 ChromeOptions 参数或什么?

问题是当我访问某些站点时(例如,https://whoer.net),它显示的系统时间等于 Windows 上设置的时间。而且我希望能够以某种方式更改 Chromedriver 的时区以执行时区相关测试。

我尝试设置一些 chrome 选项:

Map<String, Object> chromeOptions = new HashMap<String, Object>();
chromeOptions.put("args", Arrays.asList("--disable-system-timezone-automatic-detection", "--local-timezone"));
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);

它不起作用。

尝试使用 javascript 做一些奇怪的事情:

((JavascriptExecutor) driver).executeScript("Date.prototype.getTime = function()  return 1 ;");
   

也没有用。

编辑:

找到这个https://sqa.stackexchange.com/questions/8838/faking-system-time-date-with-selenium-webdriver

尝试使用从TimeShift.js 复制的代码在页面上执行 javascript,如下所示:

((JavascriptExecutor) driver).executeScript("/*code from TimeShift.js here*/ TimeShift.setTimezoneOffset(-60);");

https://whoer.net 的系统时间没有改变。我做错了什么?

【问题讨论】:

它将始终显示在 Windows 上设置的时间。在 Windows 上更改时间。 也许这个类似的问题可以帮助你***.com/questions/35848043/… @Pv-Viana 在那个问题中,他正在从某个站点抓取一个时区,然后他可以从该站点的菜单中选择所需的时区。不一样。 @ElliottFrisch 我知道我可以在 Windows 上更改时间,甚至可以在 java 代码中做到这一点:Runtime.getRuntime().exec("cmd /C time " + "16:56:10"); 但这个选项对我不利,因为我想执行一个多线程测试Chromedriver 的实例,我希望每个实例都有自己的系统时间。 请参阅:How do I do X? SO 的期望是,提出问题的用户不仅会进行研究以回答他们自己的问题,还会分享研究、代码尝试和结果。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另见:How to Ask 【参考方案1】:

你可以使用 Chrome DevTools 协议来实现,这里是 python 代码:

driver = webdriver.Chrome()
tz_params = 'timezoneId': 'America/New_York'
driver.execute_cdp_cmd('Emulation.setTimezoneOverride', tz_params)

【讨论】:

【参考方案2】:

使用新的 selenium 4,可以使用 CDP 原生完成

    WebDriverManager.chromedriver().setup();
    WebDriver driver = new ChromeDriver();
    DevTools devTools = ((ChromeDriver) driver).getDevTools();
    devTools.createSession();
    devTools.send(Emulation.setTimezoneOverride("Antarctica/Casey"));

下载以下maven依赖:

      <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.0.0-alpha-6</version>
    </dependency>

时区列表见here

【讨论】:

【参考方案3】:

据我所知,您只能使用 TZ 变量或 Decker Selenium 执行此操作。

但是,您能找到可行的解决方案吗?我正在尝试做同样的事情,但几乎没有找到解决方案。我正在尝试用 Python 来做这件事。 Tz 变量解决方案仅限于 windows 中的 Firefox,而 decker selenium 是安装在 windows 上的噩梦。

更新的 Python 解决方案可行(下)

os.environ["DEBUSSY"] = "1"

查看:How to set environment variables in Python

我不确定是否有 Java 等价物,但这个 Python 等价物在 Windows 中对我有效,但仅在 Firefox 中有效。如果你找到了一个 Java 等价物,那就太棒了,但如果这个问题对你很重要,那么 Python 就是你要走的路! :)。我相信您在 windows 中仅限于三个字母,但在 Linux 操作系统中完全自定义。例如 UTC、GMT 等。希望这对您有所帮助。我花了很长时间寻找这个,但事实证明我想多了。祝你好运!!

【讨论】:

很遗憾,我没有找到办法,而且我的信息和你一样。我正在考虑尝试 Docker,但我还没有尝试过。我正在尝试使用 Java 来实现。如果我找到方法,我会在这里分享。 @Helen Ive 更新了我的答案,有一种简单可行的方法可以用 Python 做到这一点。对于Java,我不知道如何。如果必须这样做,则必须通过命令行进行。所以在 Windows 中它会是:设置 TZ=UTC-4。然后你必须在设置后启动 chromedriver。或类似的东西。 :) 不幸的是,我需要使用 Chrome,而不是 Firefox :) 如果您在 Windows 上运行,Chrome 无法识别 TZ 变量。不过还是谢谢你@JayRen @Helen 哦,对此很抱歉,但据我所知,这在 Windows 上根本无法实现。 Firefox 是您的下一个选择,因为它有更多的隐私选项。也许在 Linux 上是可能的。不太确定。好吧,我希望您能找到解决我的问题的解决方案。 在docker中你可以设置TZ变量:docker run -d selenium/hub -e "TZ=US/Pacific"...link here

以上是关于如何在 Selenium Chromedriver 中设置时区?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Selenium Chromedriver 中设置时区?

如何使用 Java + ChromeDriver 在 AWS Lambda 中运行 Google Chrome 进行 Selenium 测试

reCAPTCHA 3 如何知道我正在使用 Selenium/chromedriver?

将cookie添加到chromedriver时如何修复Selenium中的“无效参数:无效'到期'”?

如何在 wsl2 上从 python3 运行 Selenium ChromeDriver?

如何在没有 ChromeDriver.exe 的情况下在 Maven 中使用 selenium-chrome-driver