【发布时间】:2018-12-28 13:53:51
【问题描述】:
我试图弄清楚如何使用 selenium webdriver 和 python 或 java 来注入 javascript 以修改浏览器属性/属性。 我的最终目标是使用 selenium 和 firefox 获得类似于 this 的内容,因为它是一个更开放和灵活的选择。
木偶和铬文件test.js:
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({
args: ["--no-sandbox"],
headless: true,
});
const page = await browser.newPage();
const fs = require("fs");
// In your puppeteer script, assuming the javascriptChromium.js file is in same folder of our script
const preloadFile = fs.readFileSync("./javascriptChromium.js", "utf8");
await page.evaluateOnNewDocument(preloadFile);
const testUrl="https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html";
await page.goto(testUrl);
// save screenshot
await page.screenshot({path: "puppeteer-chromium-async-script-test.png"});
await browser.close()
})();
Javascript 文件javascriptChromium.js
// overwrite the `languages` property to use a custom getter
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,
});
这段代码运行良好,我通过test Web site检查了属性是否已更改。
现在,硒和火狐:
import os
from selenium import webdriver
def readJSFile(scriptFile):
with open(scriptFile, 'r') as fileHandle:
script=fileHandle.read()
return script
injectedJavascript=readJSFile("./javascriptFirefox.js")
options=webdriver.FirefoxOptions()
options.set_headless(True)
driver=webdriver.Firefox(options=options)
driver.set_script_timeout(3)
# inject JavaScript
try:
driver.execute_async_script(injectedJavascript)
except:
print("Timeout")
# 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);")
testUrl="https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html";
driver.get(testUrl)
# example sync script
time=driver.execute_script("return performance.timing.loadEventEnd - performance.timing.navigationStart;")
print(time)
# example async script
time=driver.execute_async_script("var callback = arguments[arguments.length-1]; const time = () => { total=performance.timing.loadEventEnd - performance.timing.navigationStart; callback(total); }; time();")
print(time)
file="selenium-firefox-async-script-test.png"
driver.save_screenshot(file)
driver.quit()
Javascript 文件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();
我是 javascript 新手,但是这两种方法(puppeteer 和 selenium)之间的不同之处在于它们如何管理当前选项卡/页面。前者通过页面类和方法page.evaluateOnNewDocument 而对于后者我没有找到和等效的方法。 我也尝试过使用greasemonkey或暴力猴子注入javascript但没有成功。
你有什么建议吗?
谢谢
【问题讨论】:
标签: javascript python firefox selenium-webdriver firefox-addon