如何使服务器可以检测到我的硒测试?

时间:2019-03-15 00:56:07

标签: selenium webdriver

我目前正在努力对基于硒的UI测试进行一些改进。我要寻找的功能之一是使我们的网站能够可靠地检测出来自测试的流量,因此我可以从浏览器使用率指标和日志记录中过滤掉该流量。

我曾经想到的是用硒设置一个跟踪cookie,我可以读取服务器端将其附加到我的日志/指标中,从而更容易过滤掉它。这里的挑战是cookie是特定于域的,据我所知,其他站点无法读取它们。 Cookies也是一种有限的资源,考虑到我们网站的大小/分布式性质,很有可能会遇到这样的情况,这可能会破坏Cookie /标题的大小限制并导致页面出现问题。

这是我的最佳选择,还是有另一种可靠的方法可从我的Web服务器检测是否我的页面正在使用Selenium自动化。 (我并不是想与机器人进行战斗,我们还有其他系统可以防御DoS / DDoS攻击。

2 个答案:

答案 0 :(得分:0)

使用Chrome时,Selenium驱动程序会将webdriver属性注入浏览器的导航器对象中。对我来说,这意味着向我的页面添加以下js将其重定向到StackOverflow:

if (navigator.webdriver == true) {
    window.location = "https://stackoverflow.com";
}

因此,我想只将window.location = "https://stackoverflow.com";替换为您想要的任何内容,我猜测是将请求记录到某处,或者以某种方式将其从用于测量流量的任何工具中排除。

答案 1 :(得分:0)

因此,服务器显然需要一些令牌来告知其会话基于硒。鉴于此,这就是我要做的。

在服务器上创建一个超级简单的API。让该API获取已登录用户的会话令牌,然后将其传递到API中(几乎始终是自动的)。当API收到该会话令牌时,请在数据库中进行标记(新表或存储会话ID的同一表,如果有的话)。

已将API将会话标记为测试会话,因此对于度量标准无效。

这在统计上不会对任何服务器造成重大影响,因此无需担心资源或影响。

应该使用一个非常简单的代码隐藏API,这是一个非常轻量级的表,可以只包含一个带有涉及会话ID的外键的列。由于存在此表,因此此表中所有插入的会话ID均为测试会话。

然后,您的指标记录将需要向有效具有“ WHERE(SELECT COUNT(sessionId)FROM TestSessionsTable WHERE sessionId = currentIdChecked)= 0”的查询中添加一个子句

这将满足您的需求。我很高兴得知更好的解决方案,但这是最简单的尝试,对资源的影响最小。

关于在客户端检测Webdriver会话,您可以使用C. Peck的建议,也可以使用WebDriver的Javascript Executor逻辑从自动化运行中直接调用API。