Comment définir la taille de la fenêtre du navigateur par défaut dans Protractor / WebdriverJS

107

Pour une raison quelconque, lorsque j'exécute mes tests au travail, le navigateur est maximisé, mais lorsque je les lance à la maison, il n'ouvre qu'une fenêtre de navigateur d'environ 50% de largeur. Cela provoque des écarts avec le défilement vers le bas, etc., donc j'aimerais idéalement qu'il ouvre une fenêtre de navigateur de la même taille sur chaque machine sur laquelle les tests sont exécutés. Quelle est la meilleure façon de procéder? (J'ai trouvé des réponses pour d'autres langues mais je n'ai pas pu les adapter au javascript)

Ajouter

browser.executeScript('window.moveTo(0,0);'+
    'window.resizeTo(screen.width, screen.height);');

ne fait rien, (apparemment window.moveToet window.resizeTone sont pas pris en charge par chrome).

Jraede
la source
Je n'ai pas de réponse pour vous pour le moment, mais je peux vous le dire window.moveToet je suis window.scrollTodéfinitivement pris en charge par Chrome.
Colin Brock
scrollTo fonctionne. Mais les autres non, du moins pas d'après ce que je peux dire. Essayez de le taper dans la console ... ne fait rien.
jraede
Au risque de sortir du sujet, voici un violon qui illustre window.moveToet window.resizeTo. Cela fonctionne bien pour moi dans Chrome. Je ne sais pas si vous pouvez redimensionner la fenêtre actuelle à partir de la console dans Chrome, mais le fait que la resizeTométhode y soit disponible indique que Chrome la prend en charge.
Colin Brock
Ok, semble fonctionner pour les nouvelles fenêtres que le navigateur ouvre avec JS. Mais ne fonctionne pas avec la fenêtre actuelle, ce dont j'ai besoin.
jraede
1
Mon test est de savoir si les choses fonctionnent ou non et sont visibles dans différentes configurations réactives, je dois donc être en mesure de contrôler la taille de la fenêtre pour chaque test.
jraede

Réponses:

192

Vous pouvez définir la taille du navigateur par défaut en exécutant:

var width = 800;
var height = 600;
browser.driver.manage().window().setSize(width, height);

Pour agrandir la fenêtre du navigateur, exécutez:

browser.driver.manage().window().maximize();

Pour définir la course de position:

var x = 150;
var y = 100;
browser.driver.manage().window().setPosition(x, y);

Si vous obtenez une erreur:

WebDriverError: unknown error: operation is unsupported with remote debugging

Opération non prise en charge lors de l'utilisation du débogage à distance Certaines commandes WebDriver (par exemple le redimensionnement de la fenêtre du navigateur) nécessitent le chargement d'une extension Chrome dans le navigateur. ChromeDriver charge normalement cette "extension d'automatisation" chaque fois qu'il lance une nouvelle session Chrome.

Cependant, ChromeDriver peut être invité à se connecter à une session Chrome existante au lieu d'en lancer une nouvelle. Cela se fait en utilisant 'debuggerAddress' dans l'objet Capabilities (aka ChromeOptions). Étant donné que l'extension d'automatisation n'est chargée qu'au démarrage, certaines commandes ne sont pas prises en charge par ChromeDriver lorsque vous travaillez avec des sessions existantes via le débogage à distance.

Si l'erreur "opération non prise en charge lors de l'utilisation du débogage à distance" s'affiche, essayez de réécrire le test afin qu'il lance une nouvelle session Chrome. Cela peut être fait en supprimant «debuggerAddress» de l'objet Capabilities.

Source: https://sites.google.com/a/chromium.org/chromedriver/help/operation-not-supported-when-using-remote-debugging

Răzvan Flavius ​​Panda
la source
10
Il est également possible de maximiser le navigateur à la taille plein écran en utilisantbrowser.driver.manage().window().maximize();
Ben Smith
8
Si vous souhaitez avoir la même résolution pour tous vos tests, vous pouvez appeler ce qui précède dans protractor.conf.jsla onPreparefonction de votre fichier .
nwinkler
1
@BenSmith ne sais pas pourquoi, mais browser.driver.manage().window().maximize();ne maximise pas réellement la fenêtre pour moi. J'ai juste une fenêtre légèrement plus grande. Je setSize()finis juste par spécifier une largeur et une hauteur avec la méthode
jetcom
1
@AlexandrosSpyropoulos: cela devrait fonctionner mais vous devez vous assurer que vous n'utilisez pas xvfb dans une résolution idiote. Par exemple, par défaut, c'est 640x480.
Tadas Sasnauskas
1
@LeeGee Réponse mise à jour.
Răzvan Flavius ​​Panda
42

Vous pouvez également utiliser votre config.jspour définir la taille de la fenêtre:

// config.js
specs: [
    ...
],
capabilities: {
    browserName: 'chrome',
    chromeOptions: {
        args: ['--window-size=800,600'] // THIS!
    }
}
// ....
e-shfiyut
la source
vous devez supprimer le double tiret: args: ['window-size = 800,600']
ezain
3
Cela fonctionne comme prévu pour moi AVEC le double tiret comme indiqué dans la réponse.
Monkpit
Cela définit également la taille du navigateur lors de l'exécution de scripts e2e avec les arguments '--headless'. Ce qui est pratique si le menu est déplacé vers la vue mobile.
tony2tones
28

Si la méthode préférée:

browser.driver.manage().window().maximize();

ne fonctionne pas pour vous (par exemple exécuter des tests Protractor dans Xvfb), vous pouvez également agrandir la fenêtre de cette façon (protractor.conf.js):

onPrepare: function() {
    setTimeout(function() {
        browser.driver.executeScript(function() {
            return {
                width: window.screen.availWidth,
                height: window.screen.availHeight
            };
        }).then(function(result) {
            browser.driver.manage().window().setSize(result.width, result.height);
        });
    });
},

Version TypeScript:

import {Config, browser} from "protractor";

export let config: Config = {
    ...
    onPrepare: () => {
        setTimeout(() => {
            browser.driver.executeScript<[number, number]>(() => {
                return [
                    window.screen.availWidth,
                    window.screen.availHeight
                ];
            }).then((result: [number, number]) => {
                browser.driver.manage().window().setSize(result[0], result[1]);
            });
        });
    }
};
Martin Sznapka
la source
meilleure idée avec une résolution maximale automatique, mais vous avez oublié setPosition (0, 0) pour qu'il soit exactement au-dessus de l'écran
Andrew
Hm, mon navigateur démarre déjà à la position 0-0. Mais bon point si quelqu'un en a besoin.
Martin Sznapka
le mien commence à ... 50,50 ou quelque chose ... juste en disant :)
Andrew
cela peut dépendre du système d'exploitation, ici c'est Windows 8.1 exécuté dans Hyper-V
Andrew
16

J'ai simplement ajouté le code ci-dessous dans mon fichier protractor.conf.js et cela a bien fonctionné.

onPrepare: function() {
    var width = 1600;
    var height = 1200;
    browser.driver.manage().window().setSize(width, height);
},

À quoi servent setTimeout et executeScript dans votre réponse? J'ai du mal à trouver les meilleures pratiques dans la documentation du rapporteur ...

À mon avis, utiliser directement maximiser () est une mauvaise idée et ne devrait pas être la méthode préférée, car elle ne définirait pas la même taille sur chaque machine sur laquelle les tests sont exécutés et pourrait briser les comportements réactifs.

Eric Burel
la source
4

Dans Selenium 4 (Rapporteur 6), setRectremplace setSizeetsetPosition

Par exemple,

browser.driver.manage().window().setRect({height: 600, width: 800});
Andrew Schlei
la source
3

Dans le fichier Protractor.conf.js, ajoutez la configuration suivante

fonctionnalités: {'browserName': 'chrome', chromeOptions: {args: ['start-maximized']}}

Pritam Maske
la source
0

Modifiez votre fichier config.js comme indiqué ci-dessous.

 onPrepare: function () {
      browser.driver.manage().window().setSize(1280, 1024); //width , height

       }, 
 capabilities: {
browserName: 'chrome',
chromeOptions: {
args: [ "--start-maximized" ] // to start browser as maximixed 
         }
    },
Sameera De Silva
la source
-1

Ajoutez le code ci-dessous, cela maximisera la fenêtre du navigateur

browser.driver.manage().window().maximize();
Brijesh Yadav
la source
Bienvenue dans stackoverflow. Il existe déjà des réponses qui fournissent ces informations avec beaucoup plus d'explications. Veuillez vous assurer que vos réponses ajoutent quelque chose de nouveau à la question.
Simon.SA