Selenium Webdriver 可检测到

问题描述 投票:0回答:4

我到处都读到网站不可能检测到用户正在使用 selenium webdriver...但为什么呢?

例如,firefox 中的 webdriver 插件添加了一个“webdriver 属性”

<html>
元素。所以
<html>...
转到
<html webdriver="true">...

我很困惑...为什么无法检测到网络驱动程序?

我写了一些 Javascript 来获取 document.outerHTML...并且有 webdriver 属性! = 检测到!?

这是我在带有 Webdriver 和不带 Webdriver 的浏览器中测试的代码:

<html>
<head>
  <script type="text/javascript">
  <!--
    function showWindow(){
      javascript:(alert(document.documentElement.outerHTML));
    }
  //-->
  </script>
</head>
<body>
  <form>
    <input type="button" value="Show outerHTML" onclick="showWindow()">
  </form>
</body>
</html>

请有人解释一下为什么无法检测到 Webdriver?

javascript testing selenium webdriver detect
4个回答
4
投票

W3C 草案规范附录 E 中指出,驱动程序应提供一种机制,用于识别浏览器由 WebDriver 驱动的情况。目前,没有任何实现符合规范的这一部分。 Firefox 驱动程序目前最为接近,为

html
标签添加了一个属性。其他浏览器的未来版本和驱动程序可能会实现符合规范的检测方法。


2
投票

是的,selenium 是可检测到的。检查 当您在 chromedriver 中使用 selenium 时,网站可以检测到吗? 如果有人使用 Firefox 驱动程序进行自动化,那么很容易检测到您是否将此代码放在客户端

        try{
        if(window.document.documentElement.getAttribute("webdriver"))
            alert("Caught in 1st case :- Selenium Webdriver is banned!!!");
        }
        catch(Exception){}
        try{
        if(navigator.webdriver)
            alert("Caught in 2nd case :- Selenium Webdriver is banned!!!");
        }
        catch(Exception){}`

但是如果您使用 chrome 或 IE 驱动程序,相同的代码没有帮助。


1
投票

我必须站在 SiKing 一边,因为无论你使用什么插件,都不是实际 Selenium 工具的一部分。 你可以发布你的插件的链接吗? 也许这会带来更多启发。

一般来说,WebDriver 只是自动执行浏览器的使用,目的是尽可能地复制人类用户的操作。 这本身对于服务器来说是不可见的。 除非您更改浏览器的用户代理,否则服务器将无法轻松看到任何内容来指示正在使用的任何类型的自动化。

但是,虽然我最近才开始研究这一点,但应用程序的重复自动使用可能会在服务器日志中呈现模式,这些模式在与应用程序的交互方面可能比人类用户更加一致。 例如,如果您使用 Selenium 来抓取网站,则由于自动会话的性质,您可能会留下一些指纹。 极其一致的点击、输入、页面请求等可能会形成明显的日志模式,从而可能暴露自动化。

现在,除非您在系统上产生大量流量或进行大量重复操作,否则您不太可能被注意到。 需要在日志中生成相当异常的内容,或者需要非常敏锐的系统管理员来触发任何类型的手动调查……即使如此,也必须有人知道要寻找什么才能做出准确的决定。


0
投票

是的,可以检测到硒。机器人检测经常发展,因此我写了一篇更新的文章来解释自 2024 年 6 月起如何检测使用 Selenium 检测的(无头)Chrome(即使经过修改)。

测试用户代理中是否存在

HeadlessChrome
子字符串并验证
navigator.webdriver
的值对于不修改过多指纹的机器人仍然很有帮助。

否则,有一种新的检测技术旨在检测 Selenium 等仪器框架使用的 CDP 自动化(Chrome devtool 协议)。

新测试如下:

var cdpDetected = false;
var e = new Error();
Object.defineProperty(e, 'stack', {
   get() {
    cdpDetected = true;
   }
});

// This is part of the detection, the console.log shouldn't be removed!
console.log(e);

if (cdpDetected) {
    isBot = true;
}
© www.soinside.com 2019 - 2024. All rights reserved.