【问题标题】:How to disable javascript on a specific page in Selenium?如何在 Selenium 的特定页面上禁用 javascript?
【发布时间】:2019-12-30 14:44:26
【问题描述】:
我有一个任务:转到该页面,在其上找到另一个页面的链接并转到该页面。我需要加载另一个没有 javascript 的页面。
如果我使用这种方法:
options = Options()
options.add_experimental_option("prefs", {
"profile.managed_default_content_settings.javascript": 2
})
这会禁用所有页面上的 javascript,这是不可接受的。创建两个不同的驱动程序实例并在它们之间切换需要太多时间和资源。
任何想法如何禁用特定页面上的 javascript?
【问题讨论】:
标签:
javascript
python-3.x
selenium
google-chrome
selenium-chromedriver
【解决方案1】:
当您启动一个新的 ChromeDriver 以启动一个新的 Chrome 浏览器进程时,您必须使用 配置 ChromeDriver 的实例ChromeOptions 就在 ChromeDriver 的整个生命周期 中保持不变,并且在驱动 Chrome 时保持不可编辑 浏览器进程。
即使您能够提取 ChromeDriver 和 ChromeSession 属性,例如Session ID、Cookies 和其他来自启动的 ChromeDriver 功能或来自 Browsing Session 的会话属性,你仍然赢了'无法更改这些属性。
因此,如果您的用例是在某些特定页面上禁用 javascript,您可能需要使用单独的配置 disabling the javascript 执行这些测试,而不是在所有页面上禁用 javascript。
更简洁的方法是在 tearDown(){} 方法中调用 driver.quit() 来关闭并销毁 ChromeDriver em> 和 Chrome 浏览器 实例,然后使用新的配置集跨越一组新的 ChromeDriver 和 Chrome 浏览器 实例。
您可以在Change ChromeOptions in an existing webdriver找到相关讨论
【解决方案2】:
我将用 Java 提供我的解决方案。始终有一个选项可以在 chrome 设置中模拟打开/关闭 javascript。诀窍是创建一个实现 WebDriver 的自定义 WebDriver 类。
首先,您可以保存当前页面 URL,以便驱动程序可以知道切换 javascript 后返回的位置,之后您应该跟踪 javascript 当前状态 - 如果当前 javascript 状态与传递的启用参数不同,则继续切换 javascript .用于切换 javascript 的按钮位于屏幕中间,半径至少为页面的 60%,因此 X 轴将始终正常工作,而 Y 轴是一个近似值,大部分时间都应该工作。
这里是实现:
public class IWebDriver implements WebDriver {
private boolean enableJavascript;
private WebDriver driver;
public IWebDriver() {
// Javascript is enabled by default
this.enableJavascript = true;
this.driver = new ChromeDriver();
}
public void setEnableJavaScript(boolean enable) throws Exception {
/* Save current page URL */
String currentUrl = getCurrentUrl();
/* Toggle javascript if passed argument javascript state differentiates from actual javascript state */
if (this.enableJavaScript != enable) {
this.driver.navigate().to("chrome://settings/content/javascript");
Dimension d = driver.manage().window().getSize();
int x = d.getWidth() / 2;
int y = (int) ((float) d.getHeight() * 0.123f);
Actions actions = new Actions(this.driver);
actions.moveByOffset(x, y).click().build().perform();
// change current javascript enabled state
this.enableJavaScript = !this.enableJavaScript;
}
/* Get back to the original URL */
this.driver.navigate().to(currentUrl);
}
public boolean isEnableJavascript() {
return this.enableJavascript;
}
//Getters, setters and overridden methods...
}