Chrome 如何在Selenium中的特定页面上禁用JavaScript?

rdrgkggo  于 2023-08-01  发布在  Go
关注(0)|答案(3)|浏览(198)

我有个任务转到该页面,在它上面找到指向另一个页面的链接,然后转到该页面。我需要加载另一个没有JavaScript的页面。
如果我使用这个方法:

options = Options()
options.add_experimental_option("prefs", {
    "profile.managed_default_content_settings.javascript": 2
})

字符串
这会在所有页面上禁用JavaScript,这是不可接受的。创建两个不同的驱动程序示例并在它们之间切换需要太多的时间和资源。
如何在特定页面上禁用JavaScript?

zxlwwiss

zxlwwiss1#

我将用Java提供解决方案。在chrome设置中总是有一个选项来模拟切换JavaScript的开/关。诀窍是创建一个实现WebDriver的自定义WebDriver类。
开始,您可以保存当前页面的URL,以便驱动程序可以知道在切换JavaScript后返回的位置,之后您应该跟踪javascript当前状态-如果当前javascript状态与传递的enable参数不同,则继续切换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...

 }

字符串

jgwigjjp

jgwigjjp2#

当您启动新的 ChromeDriver 以启动新的 Chrome 浏览器进程时,您必须在开始时使用 ChromeOptions 配置 ChromeDriver 的示例,该示例在 ChromeDriver生命周期中保持不变,并且在驱动 Chrome 浏览器进程时保持不可编辑
即使您能够提取 ChromeDriverChromeSession 属性,例如会话IDCookie和其他会话属性来自启动的 ChromeDriver 功能或 * 浏览会话 ,但您仍然无法更改这些属性。
因此,如果你的用例是在某些特定的页面上禁用javascript,你可能需要使用禁用JavaScript的单独配置来执行这些测试,而不是在所有页面上禁用javascript
更简洁的方法是在tearDown(){}方法中调用
*driver.quit(),优雅地关闭销毁**
您可以在Change ChromeOptions in an existing webdriver中找到相关讨论

bmp9r5qi

bmp9r5qi3#

我喜欢BrunoT提供的解决方案,
我有一个改进。而不是使用鼠标,标签是一个有点更可预测的,所以你不必担心的位置。下面是一些C#代码

public void ToggleJavascript()
    {
        driver.Navigate().GoToUrl("chrome://settings/content/javascript");
        new Actions(driver)
            .SendKeys("\t")
            .Pause(TimeSpan.FromMilliseconds(250))
            .SendKeys("\t")
            .Pause(TimeSpan.FromMilliseconds(250))
            .SendKeys(Keys.ArrowDown)
            .Perform();
    }

字符串

相关问题