--- permalink: /helpers/WebDriver editLink: false sidebar: auto title: WebDriver --- ## WebDriver **Extends Helper** WebDriver helper which wraps [webdriverio][1] library to manipulate browser using Selenium WebDriver or PhantomJS. WebDriver requires Selenium Server and ChromeDriver/GeckoDriver to be installed. Those tools can be easily installed via NPM. Please check [Testing with WebDriver][2] for more details. ### Configuration This helper should be configured in codecept.json or codecept.conf.js - `url`: base url of website to be tested. - `basicAuth`: (optional) the basic authentication to pass to base url. Example: {username: 'username', password: 'password'} - `browser`: browser in which to perform testing. - `host`: - WebDriver host to connect. - `port`: - WebDriver port to connect. - `protocol`: - protocol for WebDriver server. - `path`: - path to WebDriver server, - `restart`: - restart browser between tests. - `smartWait`: (optional) **enables [SmartWait][3]**; wait for additional milliseconds for element to appear. Enable for 5 secs: "smartWait": 5000. - `disableScreenshots`: - don't save screenshots on failure. - `fullPageScreenshots` - make full page screenshots on failure. - `uniqueScreenshotNames`: - option to prevent screenshot override if you have scenarios with the same name in different suites. - `keepBrowserState`: - keep browser state between tests when `restart` is set to false. - `keepCookies`: - keep cookies between tests when `restart` set to false. - `windowSize`: (optional) default window size. Set to `maximize` or a dimension in the format `640x480`. - `waitForTimeout`: sets default wait time in _ms_ for all `wait*` functions. - `desiredCapabilities`: Selenium's [desired capabilities][4]. - `manualStart`: - do not start browser before a test, start it manually inside a helper with `this.helpers["WebDriver"]._startBrowser()`. - `timeouts`: [WebDriver timeouts][5] defined as hash. Example: ```js { helpers: { WebDriver : { smartWait: 5000, browser: "chrome", restart: false, windowSize: "maximize", timeouts: { "script": 60000, "page load": 10000 } } } } ``` Example with basic authentication ```js { helpers: { WebDriver : { smartWait: 5000, browser: "chrome", basicAuth: {username: 'username', password: 'password'}, restart: false, windowSize: "maximize", timeouts: { "script": 60000, "page load": 10000 } } } } ``` Additional configuration params can be used from [webdriverio website][6]. ### Headless Chrome ```js { helpers: { WebDriver : { url: "http://localhost", browser: "chrome", desiredCapabilities: { chromeOptions: { args: [ "--headless", "--disable-gpu", "--no-sandbox" ] } } } } } ``` ### Internet Explorer Additional configuration params can be used from [IE options][7] ```js { helpers: { WebDriver : { url: "http://localhost", browser: "internet explorer", desiredCapabilities: { ieOptions: { "ie.browserCommandLineSwitches": "-private", "ie.usePerProcessProxy": true, "ie.ensureCleanSession": true, } } } } } ``` ### Selenoid Options [Selenoid][8] is a modern way to run Selenium inside Docker containers. Selenoid is easy to set up and provides more features than original Selenium Server. Use `selenoidOptions` to set Selenoid capabilities ```js { helpers: { WebDriver : { url: "http://localhost", browser: "chrome", desiredCapabilities: { selenoidOptions: { enableVNC: true, } } } } } ``` ### Connect Through proxy CodeceptJS also provides flexible options when you want to execute tests to Selenium servers through proxy. You will need to update the `helpers.WebDriver.capabilities.proxy` key. ```js { helpers: { WebDriver: { capabilities: { proxy: { "proxyType": "manual|pac", "proxyAutoconfigUrl": "URL TO PAC FILE", "httpProxy": "PROXY SERVER", "sslProxy": "PROXY SERVER", "ftpProxy": "PROXY SERVER", "socksProxy": "PROXY SERVER", "socksUsername": "USERNAME", "socksPassword": "PASSWORD", "noProxy": "BYPASS ADDRESSES" } } } } } ``` For example, ```js { helpers: { WebDriver: { capabilities: { proxy: { "proxyType": "manual", "httpProxy": "http://corporate.proxy:8080", "socksUsername": "codeceptjs", "socksPassword": "secret", "noProxy": "127.0.0.1,localhost" } } } } } ``` Please refer to [Selenium - Proxy Object][4] for more information. ### Cloud Providers WebDriver makes it possible to execute tests against services like `Sauce Labs` `BrowserStack` `TestingBot` Check out their documentation on [available parameters][9] Connecting to `BrowserStack` and `Sauce Labs` is simple. All you need to do is set the `user` and `key` parameters. WebDriver automatically know which service provider to connect to. ```js { helpers:{ WebDriver: { url: "YOUR_DESIRED_HOST", user: "YOUR_BROWSERSTACK_USER", key: "YOUR_BROWSERSTACK_KEY", capabilities: { "browserName": "chrome", // only set this if you're using BrowserStackLocal to test a local domain // "browserstack.local": true, // set this option to tell browserstack to provide addition debugging info // "browserstack.debug": true, } } } } ``` #### SauceLabs SauceLabs can be configured via wdio service, which should be installed additionally: npm i @wdio/sauce-service --save It is important to make sure it is compatible with current webdriverio version. Enable `wdio` plugin in plugins list and add `sauce` service: ```js plugins: { wdio: { enabled: true, services: ['sauce'], user: ... ,// saucelabs username key: ... // saucelabs api key // additional config, from sauce service } } ``` See [complete reference on webdriver.io][10]. > Alternatively, use [codeceptjs-saucehelper][11] for better reporting. #### BrowserStack BrowserStack can be configured via wdio service, which should be installed additionally: npm i @wdio/browserstack-service --save It is important to make sure it is compatible with current webdriverio version. Enable `wdio` plugin in plugins list and add `browserstack` service: ```js plugins: { wdio: { enabled: true, services: ['browserstack'], user: ... ,// browserstack username key: ... // browserstack api key // additional config, from browserstack service } } ``` See [complete reference on webdriver.io][12]. > Alternatively, use [codeceptjs-bshelper][13] for better reporting. #### TestingBot > **Recommended**: use official [TestingBot Helper][14]. Alternatively, TestingBot can be configured via wdio service, which should be installed additionally: npm i @wdio/testingbot-service --save It is important to make sure it is compatible with current webdriverio version. Enable `wdio` plugin in plugins list and add `testingbot` service: ```js plugins: { wdio: { enabled: true, services: ['testingbot'], user: ... ,// testingbot key key: ... // testingbot secret // additional config, from testingbot service } } ``` See [complete reference on webdriver.io][15]. #### Applitools Visual testing via Applitools service > Use [CodeceptJS Applitools Helper][16] with Applitools wdio service. ### Multiremote Capabilities This is a work in progress but you can control two browsers at a time right out of the box. Individual control is something that is planned for a later version. Here is the [webdriverio docs][17] on the subject ```js { helpers: { WebDriver: { "multiremote": { "MyChrome": { "desiredCapabilities": { "browserName": "chrome" } }, "MyFirefox": { "desiredCapabilities": { "browserName": "firefox" } } } } } } ``` ## Access From Helpers Receive a WebDriver client from a custom helper by accessing `browser` property: ```js const { WebDriver } = this.helpers; const browser = WebDriver.browser ``` ## Methods ### Parameters - `config` ### _isShadowLocator Check if locator is type of "Shadow" #### Parameters - `locator` **[object][18]** ### _locate Get elements by different locator types, including strict locator. Should be used in custom helpers: ```js this.helpers['WebDriver']._locate({name: 'password'}).then //... ``` #### Parameters - `locator` **([string][19] | [object][18])** element located by CSS|XPath|strict locator. - `smartWait` ### _locateCheckable Find a checkbox by providing human readable text: ```js this.helpers['WebDriver']._locateCheckable('I agree with terms and conditions').then // ... ``` #### Parameters - `locator` **([string][19] | [object][18])** element located by CSS|XPath|strict locator. ### _locateClickable Find a clickable element by providing human readable text: ```js const els = await this.helpers.WebDriver._locateClickable('Next page'); const els = await this.helpers.WebDriver._locateClickable('Next page', '.pages'); ``` #### Parameters - `locator` **([string][19] | [object][18])** element located by CSS|XPath|strict locator. - `context` ### _locateFields Find field elements by providing human readable text: ```js this.helpers['WebDriver']._locateFields('Your email').then // ... ``` #### Parameters - `locator` **([string][19] | [object][18])** element located by CSS|XPath|strict locator. ### _locateShadow Locate Element within the Shadow Dom #### Parameters - `locator` **[object][18]** ### _smartWait Smart Wait to locate an element #### Parameters - `locator` **[object][18]** ### acceptPopup Accepts the active JavaScript native popup window, as created by window.alert|window.confirm|window.prompt. Don't confuse popups with modal windows, as created by [various libraries][20]. ### amOnPage Opens a web page in a browser. Requires relative or absolute url. If url starts with `/`, opens a web page of a site defined in `url` config parameter. ```js I.amOnPage('/'); // opens main page of website I.amOnPage('https://github.com'); // opens github I.amOnPage('/login'); // opens a login page ``` #### Parameters - `url` **[string][19]** url path or global url. ### appendField Appends text to a input field or textarea. Field is located by name, label, CSS or XPath ```js I.appendField('#myTextField', 'appended'); ``` #### Parameters - `field` **([string][19] | [object][18])** located by label|name|CSS|XPath|strict locator - `value` **[string][19]** text value to append. This action supports [React locators](https://codecept.io/react#locators) ### attachFile Attaches a file to element located by label, name, CSS or XPath Path to file is relative current codecept directory (where codecept.json or codecept.conf.js is located). File will be uploaded to remote system (if tests are running remotely). ```js I.attachFile('Avatar', 'data/avatar.jpg'); I.attachFile('form input[name=avatar]', 'data/avatar.jpg'); ``` #### Parameters - `locator` **([string][19] | [object][18])** field located by label|name|CSS|XPath|strict locator. - `pathToFile` **[string][19]** local file path relative to codecept.json config file. Appium: not tested ### cancelPopup Dismisses the active JavaScript popup, as created by window.alert|window.confirm|window.prompt. ### checkOption Selects a checkbox or radio button. Element is located by label or name or CSS or XPath. The second parameter is a context (CSS or XPath locator) to narrow the search. ```js I.checkOption('#agree'); I.checkOption('I Agree to Terms and Conditions'); I.checkOption('agree', '//form'); ``` #### Parameters - `field` **([string][19] | [object][18])** checkbox located by label | name | CSS | XPath | strict locator. - `context` **([string][19]? | [object][18])** (optional, `null` by default) element located by CSS | XPath | strict locator. Appium: not tested ### clearCookie Clears a cookie by name, if none provided clears all cookies. ```js I.clearCookie(); I.clearCookie('test'); ``` #### Parameters - `cookie` **[string][19]?** (optional, `null` by default) cookie name ### clearField Clears a `