使用Selenium修改Javascript Navigator对象 [英] Modifying the Javascript Navigator object with Selenium
问题描述
我尝试使用Selenium(使用geckodriver)访问网站,它说我被阻止但我可以使用Firefox浏览器手动访问它。所以我比较了我的fingerpirnt的组件,唯一的区别是当我使用Selenium时,在Navigator对象中webdriver被设置为true。我尝试从selenium导入webdriver
来自selenium.webdriver.firefox.options导入选项
firefox_binary ='/ usr / bin / firefox'
options = Options()
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
caps = DesiredCapabilities()。FIREFOX
#caps [pageLoadStrategy] =normal#complete
caps [pageLoadStrategy] =eager#interactive
inject_javascript =(Object.defineProperty(navigator,'webdriver') ,{value:'false'}))
driver = webdriver.Firefox(executable_path = r'/ home / kkkk / ggecko / geckodriver',firefox_binary = firefox_binary)
driver.get('https: //auth.citromail.hu/regisztracio/')
driver.execute_async_script(inject_javascript)
但它只是加载了webdriver仍然设置为true的页面,然后返回此消息:
回溯(最近一次调用最后一次):
文件/home/kkkk/driverr.py,第14行,< module>
driver.execute_async_script(inject_javascript)
文件/home/kkkk/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py,第652行,在execute_async_script中
'args':converted_args})['value']
文件/home/kkkk/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py ,第314行,执行
self.error_handler.check_response(response)
File/home/kkkk/.local/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler。 py,第242行,在check_response中
引发exception_class(消息,屏幕,堆栈跟踪)
selenium.common.exceptions.TimeoutException:消息:超时
我做错了什么或有不同的方法来实现这个目标?
请参阅此问题:
SEL enium webdriver:firefox headless注入javascript来修改浏览器属性
它提供了一个有用的途径。
这是代码:
从selenium import webdriver导入os
options = webdriver.FirefoxOptions( )
options.set_headless(True)
driver = webdriver.Firefox(options = options)
#solution here here https://stackoverflow.com/questions/17385779/how-do-i -load-a-javascript-file-into-the-dom-using-selenium
driver.execute_script(var s = window.document.createElement('script'); s.src ='javascriptFirefox.js'; window.document.head.appendChild(s);)
driver.get('https://auth.citromail.hu/regisztracio/')
Javascript文件 javascriptFirefox.js
//覆盖`languages`属性以使用自定义getter
const setProperty =()=> {
Object.defineProperty (navigator,languages,{
get:function(){
return [en-US,en,es];
}
}) ;
//覆盖`plugins`属性以使用自定义getter。
Object.defineProperty(navigator,'plugins',{
get :()=> [ 1,2,3,4,5],
});
//传递Webdriver测试
Object.defineProperty(navigator,'webdriver',{
get:()=> false,
});
callback();
};
setProperty();
I tried accessing a site with Selenium (with geckodriver) and it said I was blocked but I can access it manually with the Firefox Browser. So I compared the components of my fingerpirnt and the only difference was that in the Navigator object "webdriver" was set to "true" when I used Selenium. I tried running this code:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
firefox_binary = '/usr/bin/firefox'
options = Options()
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
caps = DesiredCapabilities().FIREFOX
# caps["pageLoadStrategy"] = "normal" # complete
caps["pageLoadStrategy"] = "eager" # interactive
injected_javascript=("Object.defineProperty(navigator, 'webdriver', { value: 'false' })")
driver = webdriver.Firefox(executable_path=r'/home/kkkk/ggecko/geckodriver', firefox_binary=firefox_binary)
driver.get('https://auth.citromail.hu/regisztracio/')
driver.execute_async_script(injected_javascript)
but it just loaded page with "webdriver" still set to "true", then returned this message:
Traceback (most recent call last):
File "/home/kkkk/driverr.py", line 14, in <module>
driver.execute_async_script(injected_javascript)
File "/home/kkkk/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 652, in execute_async_script
'args': converted_args})['value']
File "/home/kkkk/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 314, in execute
self.error_handler.check_response(response)
File "/home/kkkk/.local/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: Timed out
What am I doing wrong or is there a different way of accomplishing this?
Refer to this issue: Selenium webdriver: firefox headless inject javascript to modify browser property
it provides a useful pathway.
This is the code:
import os
from selenium import webdriver
options=webdriver.FirefoxOptions()
options.set_headless(True)
driver=webdriver.Firefox(options=options)
# solution found here https://stackoverflow.com/questions/17385779/how-do-i-load-a-javascript-file-into-the-dom-using-selenium
driver.execute_script("var s=window.document.createElement('script'); s.src='javascriptFirefox.js';window.document.head.appendChild(s);")
driver.get('https://auth.citromail.hu/regisztracio/')
Javascript file javascriptFirefox.js
// overwrite the `languages` property to use a custom getter
const setProperty = () => {
Object.defineProperty(navigator, "languages", {
get: function() {
return ["en-US", "en", "es"];
}
});
// Overwrite the `plugins` property to use a custom getter.
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5],
});
// Pass the Webdriver test
Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
callback();
};
setProperty();
这篇关于使用Selenium修改Javascript Navigator对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!