一、常见的方法是使用如下配置解决window.navigator.webdriver属性值问题,确实有用,有些网站正常可以打开,selenium中打不开,或者返回错误,可以试下
? ? ? ? ? ? ? ?
options.AddArgument("--disable-blink-features=AutomationControlled");
再进阶点,利用浏览器端开发霸权强制写入一段js,修改变量值window.navigator.webdriver
? driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
? ? ? ? "source": """
? ? ? ? ? ? ? ? ? ? Object.defineProperty(navigator, 'webdriver', {
? ? ? ? ? ? ? ? ? ? ? get: () => undefined
? ? ? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? ? """
? ? })
二、我遇到的问题比较奇葩,第一次可以打开,一旦使用driver.findxxx(),或者driver.getxx()之后就会触发反爬策略,症状就是之后任何请求都会报错,具体原因没搞清楚。但是,f12执行js是不会导致以上情况。基于f12无问题的原则,翻了chrome dev tools的开发文档:
Chrome DevTools Protocol - Runtime domain
发现有一个可以执行js的接口,而且还可以有接收返回值,奈何资料实在太少,好不容易跑通,执行了个alert没有触发,代码如下
(??C#代码,注意引用最新版webdriver,nuget搜selenium前两个)???????????????
?string path = AppDomain.CurrentDomain.BaseDirectory + "/test.js";
? ? ? ? ? ? ? ? string str2 = File.ReadAllText(path);
? ? ? ? ? ? ? ? //没找到怎么传参, 用这个low方法把
? ? ? ? ? ? ? ? str2 = str2.Replace("_name_", name);
? ? ? ? ? ? ? ? //log("注入的js代码:" + str2);
? ? ? ? ? ? ? ? p.Add("expression", str2);
? ? ? ? ? ? ? ? //调用Runtime.evaluate,传入p执行
? ? ? ? ? ? ? ? driver.ExecuteCdpCommand("Runtime.evaluate", p);
(js代码)
? ? ? ? ? ? ?
?alert(1);
三、继续尝试如何接收返回值,毕竟要爬东西。
? ? ? ? (C#)?????????????
???string path = AppDomain.CurrentDomain.BaseDirectory + "/test2.js";
? ? ? ? ? ? ? ? string str2 = File.ReadAllText(path);
? ? ? ? ? ? ? ? p.Add("expression", str2);//代码
? ? ? ? ? ? ? ? p.Add("returnByValue", true);//接收返回值【注意,js中return必须是json格式,不然收不到!!!】
? ? ? ? ? ? ? ? p.Add("awaitPromise", true);//是否异步
? ? ? ? ? ? ? ? //执行,并接收返回值
? ? ? ? ? ? ? ? Dictionary<string, Object> r =(Dictionary<string,Object>)driver.ExecuteCdpCommand("Runtime.evaluate", p);
????????(js:匿名函数,直接执行,【同步返回】)? ? ? ? ? ? ? ?
(function(){
????????? ? ? ? ? ? ? ? ? ? return {a:1}
???????????????????})();
? ? ? ? (js:匿名函数,异步返回)? ? ? ? ? ? ? ?
(async function(){
????????????????????????return new Promise((resolve, reject) => {
????????????????????????????????resolve({a:1});
? ? ? ? ? ? ? ? ? ? ? ? ? });
???????????????????})();
over,能写js,随时随地执行,能传参,能接返回值,还能异步,还有什么做不了的呢?
|