Style guide for Selenium documentation
Read our contributing documentation for complete instructions on how to add content to this documentation.
Alerts
Alerts have been added to direct potential contributors to where specific content is missing.
{{< alert-content />}}
or
{{< alert-content >}}
Additional information about what specific content is needed
{{< /alert-content >}}
Which gets displayed like this:
Content Help
Additional information about what specific content is needed
Check our contribution guidelines if you’d like to help.
Capitalization of titles
Our documentation uses Title Capitalization for linkTitle
which should be short
and Sentence capitalization for title
which can be longer and more descriptive.
For example, a linkTitle
of Special Heading might have a title
of
The importance of a special heading in documentation
Line length
When editing the documentation’s source, which is written in plain HTML, limit your line lengths to around 100 characters.
Some of us take this one step further and use what is called semantic linefeeds, which is a technique whereby the HTML source lines, which are not read by the public, are split at ‘natural breaks’ in the prose. In other words, sentences are split at natural breaks between clauses. Instead of fussing with the lines of each paragraph so that they all end near the right margin, linefeeds can be added anywhere that there is a break between ideas.
This can make diffs very easy to read when collaborating through git, but it is not something we enforce contributors to use.
Translations
Selenium now has official translators for each of the supported languages.
- If you add a code example to the
important_documentation.en.md
file, also add it toimportant_documentation.ja.md
,important_documentation.pt-br.md
,important_documentation.zh-cn.md
. - If you make text changes in the English version, just make a Pull Request. The new process is for issues to be created and tagged as needs translation based on changes made in a given PR.
Code examples
All references to code should be language independent, and the code itself should be placed inside code tabs.
Default Code Tabs
The Docsy code tabs look like this:
WebDriver driver = new ChromeDriver();
driver = webdriver.Chrome()
var driver = new ChromeDriver();
driver = Selenium::WebDriver.for :chrome
let driver = await new Builder().forBrowser('chrome').build();
val driver = ChromeDriver()
To generate the above tabs, this is what you need to write.
Note that the tabpane
includes langEqualsHeader=true
.
This auto-formats the code in each tab to match the header name,
but more importantly it ensures that all tabs on the page with a language
are set to the same thing, so we always want to include it.
{{< tabpane langEqualsHeader=true >}}
{{< tab header="Java" >}}
WebDriver driver = new ChromeDriver();
{{< /tab >}}
{{< tab header="Python" >}}
driver = webdriver.Chrome()
{{< /tab >}}
{{< tab header="CSharp" >}}
var driver = new ChromeDriver();
{{< /tab >}}
{{< tab header="Ruby" >}}
driver = Selenium::WebDriver.for :chrome
{{< /tab >}}
{{< tab header="JavaScript" >}}
let driver = await new Builder().forBrowser('chrome').build();
{{< /tab >}}
{{< tab header="Kotlin" >}}
val driver = ChromeDriver()
{{< /tab >}}
{{< /tabpane >}}
Reference Github Examples
To ensure that all code is kept up to date, our goal is to write the code in the repo where it can be executed when Selenium versions are updated to ensure that everything is correct.
All code examples to be in our example directories.
This code can be automatically displayed in the documentation using the gh-codeblock
shortcode.
The shortcode automatically generates its own html, so if any tab is using this shortcode,
set text=true
in the tabpane
/tab
to prevent the auto-formatting, and add code=true
in any
tab
that still needs to get formatted with code.
Either way, set langEqualsHeader=true
to keep the language tabs synchronized throughout the page.
Note that the gh-codeblock
line can not be indented at all.
One great thing about using gh-codeblock
is that it adds a link to the full example.
This means you don’t have to include any additional context code, just the line(s) that
are needed, and the user can navigate to the repo to see how to use it.
A basic comparison of code looks like:
{{< tabpane text=true langEqualsHeader=true >}}
{{< tab header="Java" >}}
{{< gh-codeblock path="examples/java/src/test/java/dev/selenium/getting_started/FirstScriptTest.java#L46-L47" >}}
{{< /tab >}}
{{< tab header="Python" >}}
{{< gh-codeblock path="examples/python/tests/getting_started/test_first_script.py#L17-L18" >}}
{{< /tab >}}
{{< tab header="CSharp" >}}
{{< gh-codeblock path="examples/dotnet/SeleniumDocs/GettingStarted/FirstScriptTest.cs#L39-L40" >}}
{{< /tab >}}
{{< tab header="Ruby" >}}
{{< gh-codeblock path="examples/ruby/spec/getting_started/first_script_spec.rb#L16-L17" >}}
{{< /tab >}}
{{< tab header="JavaScript" >}}
{{< gh-codeblock path="examples/javascript/test/getting_started/firstScript.spec.js#L23-L24" >}}
{{< /tab >}}
{{< tab header="Kotlin" >}}
{{< gh-codeblock path="examples/kotlin/src/test/kotlin/dev/selenium/getting_started/FirstScriptTest.kt#L25-L26" >}}
{{< /tab >}}
{{< /tabpane >}}
Which looks like this:
text_box.send_keys("Selenium")
text_box = driver.find_element(name: 'my-text')
submit_button = driver.find_element(tag_name: 'button')
let textBox = await driver.findElement(By.name('my-text'));
let submitButton = await driver.findElement(By.css('button'));
var textBox = driver.findElement(By.name("my-text"))
val submitButton = driver.findElement(By.cssSelector("button"))
Using Markdown in a Tab
If you want your example to include something other than code (default) or html (from gh-codeblock
),
you need to first set text=true
,
then change the Hugo syntax for the tab
to use %
instead of <
and >
with curly braces:
{{< tabpane text=true langEqualsHeader=true >}}
{{% tab header="Java" %}}
1. Start the driver
{{< gh-codeblock path="examples/java/src/test/java/dev/selenium/getting_started/FirstScriptTest.java#L17" >}}
2. Navigate to a page
{{< gh-codeblock path="examples/java/src/test/java/dev/selenium/getting_started/FirstScriptTest.java#L18" >}}
3. Quit the driver
{{< gh-codeblock path="examples/java/src/test/java/dev/selenium/getting_started/FirstScriptTest.java#L35" >}}
{{% /tab %}}
< ... >
{{< /tabpane >}}
This produces:
- Start the driver
WebDriver driver = new ChromeDriver();
- Navigate to a page
driver.get("https://www.selenium.dev/selenium/web/web-form.html");
- Quit the driver
driver.quit();
This is preferred to writing code comments because those will not be translated. Only include the code that is needed for the documentation, and avoid over-explaining. Finally, remember not to indent plain text or it will rendered as a codeblock.