Ce que j'essaie d'accomplir, c'est de naviguer sur une page, d'attendre que quelque chose se charge, puis de prendre et d'enregistrer une capture d'écran.
Le code que j'ai déjà est
WebDriver driver = new FirefoxDriver();
driver.get("http://www.site.com");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
try {
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("/home/Desktop/image.png"));
} catch (Exception e) {
e.printStackTrace();
}
driver.close();
La raison pour laquelle je dois attendre, même si la page est chargée, c'est parce qu'elle sera chargée, mais sur le site, le contenu, je voudrais prendre une photo des chargements après quelques secondes. Pour une raison quelconque, la page n'attend pas, existe-t-il une autre méthode que je peux utiliser pour que le pilote/la page attende X secondes?
Vous pouvez localiser un élément qui se charge après le chargement initial de la page, puis faire attendre Selenium jusqu'à ce que cet élément soit trouvé.
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("ID")));
Ce ne serait pas vraiment une chose spécifique au sélénium. Vous voulez juste Java dormir un peu après avoir chargé la page mais avant de prendre la capture d'écran.
Thread.sleep(4000);
mettez cela après votre instruction driver.get.
Si vous souhaitez retarder un certain nombre de secondes, plutôt que de répondre le plus rapidement possible, voici une fonction de pause similaire à ce que Selenium IDE propose:
public void pause(Integer milliseconds){
try {
TimeUnit.MILLISECONDS.sleep(milliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Juste au cas où cela aiderait quelqu'un, vous devriez toujours essayer d'éviter autant que possible les attentes implicites et surtout Thread#sleep
. Si vous faites Thread.sleep(10)
, votre code attendra toujours pendant 10 secondes, même si votre page est prête après 1 seconde. Cela peut donc ralentir considérablement vos tests si vous l'utilisez souvent.
La meilleure façon est d'utiliser ExplicitWaits ce qui signifie que vous attendez exactement aussi longtemps qu'une action se produit ou qu'un élément est rendu sur la page. Donc, dans votre cas, j'utiliserais une attente explicite pour vérifier si tout est chargé, puis prendre une capture d'écran.
const { By, until } = require('Selenium-webdriver');
this.wait = async function (amount: number) {
try {
await this.driver.wait(
until.elementLocated(By.css('[data-test-id="does-not-exist"]')),
amount,
'Looking for element'
);
} catch (e) {
console.log('waiting')
}
Nous recherchons un identifiant CSS qui n'est pas là pendant x secondes. Il s'agit de TypeScript btw. Ce serait une méthode sur une classe pertinente, ou une fonction en elle-même. Utilisez-le comme ceci
const button = await this.findByCSSSelector('[data-test-id="get-quote-button"]')
const actions = this.driver.actions({ bridge: true });
await actions.move({Origin: button }).perform();
// Small pause to observe animation is working correctly in all browsers
await this.wait(700)
const carat = await this.findByCSSSelector('[data-test-id="carat"]');
Cela attend 0,7 seconde pour que vous puissiez voir que quelle que soit l'animation qui fonctionne dans vos tests fonctionnels.