【问题标题】:Selenium: Clear chrome cacheSelenium:清除 chrome 缓存
【发布时间】:2018-09-11 20:15:15
【问题描述】:

在我的应用程序中,我需要一种在注销前仅清除 chrome 浏览器缓存的方法(cookie 除外 - 我不想删除 cookie)。

谁能给我建议一种方法来单击 chrome 中的 CLEAR DATA 按钮。 我已经编写了以下代码,但代码不起作用。

配置:

Chrome 版本:版本 65.0.3325.181(官方构建)(64 位)

硒版本:3.11.0

//Clear the cache for the ChromeDriver instance.
driver.get("chrome://settings/clearBrowserData");
Thread.sleep(10000);
driver.findElement(By.xpath("//*[@id='clearBrowsingDataConfirm']")).click();

【问题讨论】:

  • 您是否能够通过开发工具通过 xpath 试验识别元素?

标签: google-chrome selenium


【解决方案1】:

你在这里使用

driver.findElement(By.xpath("//*[@id='clearBrowsingDataConfirm']")).click();

很遗憾,这不起作用,因为 Chrome 设置页面使用 PolymerWebComponents,需要使用使用 /deep/ 组合器的查询选择器,所以这里的选择器案例是* /deep/ #clearBrowsingDataConfirm

这是您的问题的解决方法...您可以使用以下任一方法实现相同...

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.Test;

public class ClearChromeCache {

    WebDriver driver;

    /*This will clear cache*/
    @Test
    public void clearCache() throws InterruptedException {
        System.setProperty("webdriver.chrome.driver","C://WebDrivers/chromedriver.exe");
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.addArguments("disable-infobars");
        chromeOptions.addArguments("start-maximized");
        driver = new ChromeDriver(chromeOptions);
        driver.get("chrome://settings/clearBrowserData");
        Thread.sleep(5000);
        driver.switchTo().activeElement();
        driver.findElement(By.cssSelector("* /deep/ #clearBrowsingDataConfirm")).click();
        Thread.sleep(5000);
    }

    /*This will launch browser with cache disabled*/
    @Test
    public void launchWithoutCache() throws InterruptedException {
        System.setProperty("webdriver.chrome.driver","C://WebDrivers/chromedriver.exe");
        DesiredCapabilities cap = DesiredCapabilities.chrome();
        cap.setCapability("applicationCacheEnabled", false);
        driver = new ChromeDriver(cap);
    }
}

【讨论】:

  • 这是我需要的东西,但我已经使用了 ChromeOptions (disable-infobars),所以有没有办法同时使用 ChromeOptions 和 DesiredCapabilities,或者有没有办法通过 ChromeOptions 参数禁用缓存? @DebanjanB 我也在标记你,因为你也可以为我回答这个问题。
  • @BillHileman 我想您正在寻找配置 DesiredCapabilities 然后使用 MutableCapabilities 中的merge() 合并到 ChromeOptions 你可以在this discussion选项B中找到一个例子
  • 我知道你不应该使用 cmets 来感谢别人,但感谢@DebanjanB。
  • 此解决方案也不再有效:developers.google.com/web/updates/2017/10/…
【解决方案2】:

2020 年解决方案(使用 Selenium 4 alpha):

使用开发工具

    private void clearDriverCache(ChromeDriver driver) {
    driver.getDevTools().createSessionIfThereIsNotOne();
    driver.getDevTools().send(Network.clearBrowserCookies());
    // you could also use                
    // driver.getDevTools().send(Network.clearBrowserCache());
}

【讨论】:

【解决方案3】:

Chrome 支持 DevTools 协议命令,例如 Network.clearBrowserCache (documentation)。 Selenium 默认没有此专有协议的接口。

您可以通过扩展 Selenium 的命令来添加支持:

driver.command_executor._commands['SEND_COMMAND'] = (
    'POST', '/session/$sessionId/chromium/send_command'
)

这是你使用它的方式:

driver.execute('SEND_COMMAND', dict(cmd='Network.clearBrowserCache', params={}))

注意:此示例适用于 Python 的 Selenium,但也可以通过扩展命令以类似的方式在 Selenium 中用于其他平台。

【讨论】:

    【解决方案4】:

    不要忘记发送键!!!!

    对于Selenium Basic,下面的代码是正常的。

    Function clean_cache()
    
        Set driver = New ChromeDriver
        Dim keys As New Selenium.keys
    
    
                    driver.Get "chrome://settings/clearBrowserData"
                    Sleep 5000
                    driver.SendKeys (keys.Tab)
                    Sleep 1000
                    driver.SendKeys (keys.Tab)
                    Sleep 1000
                    driver.SendKeys (keys.Tab)
                    Sleep 1000
                    driver.SendKeys (keys.Tab)
                    Sleep 1000
                    driver.SendKeys (keys.Tab)
                    Sleep 1000
                    driver.SendKeys (keys.Tab)
                    Sleep 1000
                    driver.SendKeys (keys.Tab)
                    Sleep 1000
                    driver.SendKeys (keys.Enter)
                    Sleep 2000
                    driver.Quit
    
    End Function
    

    【讨论】:

    • 这种“方法”有效 python +chromedriver +chrome 81.0 driver.get('chrome://settings/clearBrowserData') wait_until(lambda: (driver.find_element_by_xpath('//settings-ui') )) ui = driver.find_element_by_xpath('//settings-ui') ui.send_keys(Keys.TAB) # todo: 这个对话框可能随时改变 ui.send_keys(Keys.TAB) ui.send_keys(Keys.TAB) ui.send_keys(Keys.TAB) ui.send_keys(Keys.TAB) ui.send_keys(Keys.TAB) ui.send_keys(Keys.ENTER) wait_until(lambda: (driver.find_element_by_xpath('//settings-ui')) , 超时=60)
    【解决方案5】:

    还有另一种方法可以通过遍历影子树来单击清除数据按钮。如果您试图通过简单地通过定位器策略搜索网络元素来定位清除数据按钮,由于 Chrome 浏览器版本升级,它将无法正常工作。您需要遍历阴影树。您可以尝试下面的代码在提前选项卡中点击“清除数据”:

    package selenium.demo.test;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    public class Test {
    static WebDriver driver;
    public static void main(String[] args) {
     System.setProperty("webdriver.chrome.driver","F:\\selenium\\chromedriver.exe");
        // Instantiate a ChromeDriver class.       
     driver=new ChromeDriver();  
     driver.get("chrome://settings/clearBrowserData");
     WebElement root1 = driver.findElement(By.cssSelector("settings-ui"));
        // get 1st shadowroot element
        WebElement shadowRoot1 = expandRootElement(root1);
    
        // get 2nd parent
        WebElement root2 = shadowRoot1.findElement(By.cssSelector("settings-main"));
        // get 2nd shadowroot element
        WebElement shadowRoot2 = expandRootElement(root2);
    
        // get 3rd parent
        WebElement root3 = shadowRoot2.findElement(By.cssSelector("settings-basic-page"));
        // get 3rd shadowroot element
        WebElement shadowRoot3 = expandRootElement(root3);
    
        // get 4th parent
        WebElement root4 = shadowRoot3.findElement(By.cssSelector("settings-section > settings-privacy-page"));
        // get 4th shadowroot element
        WebElement shadowRoot4 = expandRootElement(root4);
    
        // get 5th parent
        WebElement root5 = shadowRoot4.findElement(By.cssSelector("settings-clear-browsing-data-dialog"));
        // get 5th shadowroot element
        WebElement shadowRoot5 = expandRootElement(root5);
    
        // get 6th parent
        WebElement root6 = shadowRoot5.findElement(By.cssSelector("#clearBrowsingDataDialog"));
        WebElement root7 = root6.findElement(By.cssSelector("cr-tabs[role='tablist']"));
        root7.click();
    
        WebElement clearDataButton = root6.findElement(By.cssSelector("#clearBrowsingDataConfirm"));
    
    
        clearDataButton.click(); // click that hard to reach button!
        driver.quit();
    
    }
    private static WebElement expandRootElement(WebElement element) {
        WebElement ele = (WebElement) ((JavascriptExecutor) driver)
                .executeScript("return arguments[0].shadowRoot", element);
        return ele;
    }
    
    }
    

    【讨论】:

      【解决方案6】:

      下面的 sn-p 导航到用于清除浏览器数据的 chrome 设置,并向打开的对话框发送按键。然后它等待选项卡关闭。您可以轻松地手动执行这些步骤。

      IWebDriver Driver = new ChromeDriver()
      Driver.Navigate().GoToUrl("chrome://settings/clearBrowserData");
      Driver.SwitchTo().ActiveElement();
      Driver.FindElement(By.XPath("//settings-ui")).SendKeys(Keys.Enter);
      var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(30));
      wait.Until(wd => wd.Url.StartsWith("chrome://settings"));
      

      【讨论】:

      • @ItamarMushkin sn-p 导航到 chrome 设置以清除浏览器数据,并向打开的对话框发送按键。然后它等待选项卡关闭。您可以轻松地手动执行这些步骤。
      • 不,添加解释作为答案的一部分,而不是在 cmets 中(之后,我们可以删除整个 cmets 讨论)
      【解决方案7】:

      这种方式对我有用: 在第一步 =>

      pip install keyboard
      

      第二步:在你的代码中使用它=>

      from time import sleep
      self.driver.get('chrome://settings/clearBrowserData')
      sleep(10)
      keyboard.send("Enter")
      

      【讨论】:

        【解决方案8】:

        方法 #1 对我使用 python selenium 和 chromedriver 87 清除 JWT 有效。

        # method 1
        driver.execute_script('window.localStorage.clear()')
        
        # method 2
        driver.execute_script('window.sessionStorage.clear()')
        

        【讨论】:

          【解决方案9】:

          不推荐使用正确的解决方案,我已按照本指南解决了该问题:

          https://www.browserstack.com/guide/how-to-handle-cookies-in-selenium#:~:text=Navigate%20to%20the%20chrome%20settings,to%20open%20Chrome%20Developer%20Tools.

          具体来说,使用命令:

          driver.manage().deleteAllCookies();
          

          【讨论】:

            【解决方案10】:
            self.driver.get('chrome://settings/clearBrowserData')
            time.sleep(0.5)  # this is necessary
            actions = ActionChains(self.driver)
            actions.send_keys(Keys.TAB * 7 + Keys.ENTER)
            actions.perform()
            

            【讨论】:

              【解决方案11】:

              控制协议已经有这个任务: https://chromedevtools.github.io/devtools-protocol/tot/Network/#method-clearBrowserCache

              Selenium v​​4+ 已在其 API 中实现了这一点:

              driver.getDevTools().send(Network.clearBrowserCache());
              

              对于旧版本的 selenium,仍然可以使用底层协议本地调用此方法:

              private void clearCache(ChromeDriverService service, WebDriver driver) throws IOException {
                      Map<String, Object> commandParams = new HashMap<>();
                      commandParams.put("cmd", "Network.clearBrowserCache");
                      commandParams.put("params", emptyMap());
                      ObjectMapper objectMapper = new ObjectMapper();
                      HttpClient httpClient = HttpClientBuilder.create().build();
                      String command = objectMapper.writeValueAsString(commandParams);
                      String u = service.getUrl().toString() + "/session/" + driver.getSessionId() + "/chromium/send_command";
                      HttpPost request = new HttpPost(u);
                      request.addHeader("content-type", "application/json");
                      request.setEntity(new StringEntity(command));
                      httpClient.execute(request);
                  }
              

              注意:对于铬,您应该使用"/chromium/send_command" 端点,对于铬:"/goog/cdp/execute"。 但根据我的经验,它们在铬和铬中的工作方式相同。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-05-19
                • 2018-10-31
                • 2019-11-07
                • 2018-03-13
                • 2022-01-10
                • 1970-01-01
                • 2015-01-21
                • 1970-01-01
                相关资源
                最近更新 更多