Dans mon application, j'ai besoin d'un moyen d'effacer uniquement le cache du navigateur chrome avant de vous déconnecter (sauf les cookies - je ne veux pas supprimer les cookies).
Quelqu'un peut-il me suggérer un moyen de cliquer sur le bouton EFFACER LES DONNÉES en chrome. J'ai écrit le code ci-dessous mais le code ne fonctionne pas.
Configuration :
Version Chrome: version 65.0.3325.181 (version officielle) (64 bits)
Version de sélénium: 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();
Vous utilisez ici
driver.findElement(By.xpath("//*[@id='clearBrowsingDataConfirm']")).click();
Malheureusement, cela ne fonctionnera pas car la page de paramètres Chrome Chrome utilise Polymer et WebComponents, doit utiliser le sélecteur de requête en utilisant le/deep/combinateur, donc le sélecteur dans ce cas est * /deep/ #clearBrowsingDataConfirm
.
Voici une solution à votre problème ... vous pouvez obtenir le même résultat en utilisant l'une des méthodes suivantes ...
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);
}
}
N'oubliez pas les clés d'envoi !!!!
Pour Selenium Basic, le code ci-dessous est fonctionnel.
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
Il existe une autre façon de cliquer sur le bouton Effacer les données en parcourant l'arbre d'ombre. Si vous essayez de localiser le bouton Effacer les données en recherchant simplement l'élément Web par la stratégie de localisation, cela ne fonctionnera pas en raison de Chrome. Vous devez parcourir l'arborescence des ombres. Vous pouvez essayer ci-dessous le code pour cliquer sur "Effacer les données" dans l'onglet à l'avance:
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;
}
}
Chrome prend en charge les commandes du protocole DevTools comme Network.clearBrowserCache
pour lequel Selenium n'a pas encore d'interface. Vous pouvez l'utiliser en développant les commandes Selenium comme ceci:
send_command = ('POST', '/session/$sessionId/chromium/send_command')
driver.command_executor._commands['SEND_COMMAND'] = send_command
driver.execute('SEND_COMMAND', dict(cmd='Network.clearBrowserCache', params={}))
Cet exemple concerne Selenium pour Python, mais il est également possible dans Selenium pour Node/Java.
Voir https://chromedevtools.github.io/devtools-protocol/tot/Network#method-clearBrowserCache