<!-- *********************
  DO NOT EDIT THIS FILE
  It is a generated build output from Stardoc.
  Instead you must edit the .bzl file where the rules are declared,
  or possibly a markdown file next to the .bzl file
 ********************* -->

# Protractor rules for Bazel

The Protractor rules run tests under the Protractor framework with Bazel.

## Installation

Add the `@bazel/protractor` npm package to your `devDependencies` in `package.json`.

## Known issues with running Chromium for macOS/Windows in Bazel

For macOS and Windows, Chromium comes with files that contain spaces in their file names. This breaks runfile tree
creation within Bazel due to a bug. There are various workarounds that allow for Chromium on these platforms:

* Instruct Bazel to automatically disable runfile tree creation if not needed. [More details here](https://github.com/bazelbuild/bazel/issues/4327#issuecomment-922106293)
* Instruct Bazel to use an alternative experimental approach for creating runfile trees. [More details here](https://github.com/bazelbuild/bazel/issues/4327#issuecomment-627422865)


## protractor_web_test

**USAGE**

<pre>
protractor_web_test(<a href="#protractor_web_test-name">name</a>, <a href="#protractor_web_test-configuration">configuration</a>, <a href="#protractor_web_test-on_prepare">on_prepare</a>, <a href="#protractor_web_test-srcs">srcs</a>, <a href="#protractor_web_test-deps">deps</a>, <a href="#protractor_web_test-data">data</a>, <a href="#protractor_web_test-server">server</a>, <a href="#protractor_web_test-tags">tags</a>, <a href="#protractor_web_test-peer_deps">peer_deps</a>,
                    <a href="#protractor_web_test-protractor_entry_point">protractor_entry_point</a>, <a href="#protractor_web_test-kwargs">kwargs</a>)
</pre>

Runs a protractor test in a browser.

**PARAMETERS**


<h4 id="protractor_web_test-name">name</h4>

The name of the test



<h4 id="protractor_web_test-configuration">configuration</h4>

Protractor configuration file.

Defaults to `None`

<h4 id="protractor_web_test-on_prepare">on_prepare</h4>

A file with a node.js script to run once before all tests run.
If the script exports a function which returns a promise, protractor
will wait for the promise to resolve before beginning tests.

Defaults to `None`

<h4 id="protractor_web_test-srcs">srcs</h4>

JavaScript source files

Defaults to `[]`

<h4 id="protractor_web_test-deps">deps</h4>

Other targets which produce JavaScript such as `ts_library`

Defaults to `[]`

<h4 id="protractor_web_test-data">data</h4>

Runtime dependencies

Defaults to `[]`

<h4 id="protractor_web_test-server">server</h4>

Optional server executable target

Defaults to `None`

<h4 id="protractor_web_test-tags">tags</h4>

Standard Bazel tags, this macro adds one for ibazel

Defaults to `[]`

<h4 id="protractor_web_test-peer_deps">peer_deps</h4>

List of peer npm deps required by protractor_web_test

Defaults to `["@npm//@bazel/protractor", "@npm//protractor"]`

<h4 id="protractor_web_test-protractor_entry_point">protractor_entry_point</h4>

A label providing the protractor entry point
Default to `:node_modules/protractor/bin/protractor`.

Defaults to `Label("@npm//:node_modules/protractor/bin/protractor")`

<h4 id="protractor_web_test-kwargs">kwargs</h4>

passed through to `protractor_web_test`




## protractor_web_test_suite

**USAGE**

<pre>
protractor_web_test_suite(<a href="#protractor_web_test_suite-name">name</a>, <a href="#protractor_web_test_suite-browsers">browsers</a>, <a href="#protractor_web_test_suite-web_test_data">web_test_data</a>, <a href="#protractor_web_test_suite-wrapped_test_tags">wrapped_test_tags</a>, <a href="#protractor_web_test_suite-kwargs">kwargs</a>)
</pre>

Defines a test_suite of web_test targets that wrap a protractor_web_test target.

**PARAMETERS**


<h4 id="protractor_web_test_suite-name">name</h4>

The base name of the test



<h4 id="protractor_web_test_suite-browsers">browsers</h4>

A sequence of labels specifying the browsers to use.

Defaults to `None`

<h4 id="protractor_web_test_suite-web_test_data">web_test_data</h4>

Data dependencies for the wrapper web_test targets.

Defaults to `[]`

<h4 id="protractor_web_test_suite-wrapped_test_tags">wrapped_test_tags</h4>

A list of test tag strings to use for the wrapped
karma_web_test target.

Defaults to `["manual", "noci"]`

<h4 id="protractor_web_test_suite-kwargs">kwargs</h4>

Arguments for the wrapped karma_web_test target.




