diff --git a/examples/python/tests/elements/test_finders.py b/examples/python/tests/elements/test_finders.py index 11e1eea98ce..bdab1f8c552 100644 --- a/examples/python/tests/elements/test_finders.py +++ b/examples/python/tests/elements/test_finders.py @@ -1,46 +1,38 @@ -import pytest -from selenium import webdriver from selenium.webdriver.common.by import By -# The tests below marked as skipped mirror the HTML snippet shown at the top of the -# "Finding web elements" documentation and are illustrative only, matching how the -# same examples are shown for the other language bindings: -# -#
    -#
  1. … -#
  2. … -#
  3. Tomato is a Vegetable… -#
-# +LOCATORS_PAGE = "https://www.selenium.dev/selenium/web/locators_tests/locators.html" -@pytest.mark.skip(reason="illustrative example, not an executable test") -def test_basic_finders(driver): - vegetable = driver.find_element(By.CLASS_NAME, 'tomatoes') +def test_first_matching_element(driver): + driver.get(LOCATORS_PAGE) + first_input = driver.find_element(By.CLASS_NAME, "information") + + assert first_input.get_attribute("id") == "fname" -@pytest.mark.skip(reason="illustrative example, not an executable test") def test_subset_of_dom(driver): - fruits = driver.find_element(By.ID, 'fruits') - fruit = fruits.find_element(By.CLASS_NAME, 'tomatoes') + driver.get(LOCATORS_PAGE) + form = driver.find_element(By.TAG_NAME, "form") + input_element = form.find_element(By.CLASS_NAME, "information") + + assert input_element.get_attribute("id") == "fname" -@pytest.mark.skip(reason="illustrative example, not an executable test") def test_optimized_locator(driver): - fruit = driver.find_element(By.CSS_SELECTOR, '#fruits .tomatoes') + driver.get(LOCATORS_PAGE) + input_element = driver.find_element(By.CSS_SELECTOR, "form .information") + + assert input_element.get_attribute("id") == "fname" -@pytest.mark.skip(reason="illustrative example, not an executable test") def test_all_matching_elements(driver): - plants = driver.find_elements(By.TAG_NAME, 'li') + driver.get(LOCATORS_PAGE) + inputs = driver.find_elements(By.TAG_NAME, "input") + assert len(inputs) > 1 -def test_evaluating_shadow_dom(): - driver = webdriver.Chrome() + +def test_evaluating_shadow_dom(driver): driver.implicitly_wait(5) driver.get('https://www.selenium.dev/selenium/web/shadowRootPage.html') @@ -52,43 +44,32 @@ def test_evaluating_shadow_dom(): assert shadow_host.is_displayed() assert shadow_content.is_displayed() - driver.quit() - -def test_get_element(): - driver = webdriver.Chrome() - driver.get('https://www.example.com') +def test_get_element(driver): + driver.get(LOCATORS_PAGE) elements = driver.find_elements(By.TAG_NAME, 'p') for element in elements: - print(element.text) + print(f"Paragraph text:{element.text}") assert len(elements) > 0 - driver.quit() +def test_find_elements_from_element(driver): + driver.get(LOCATORS_PAGE) -def test_find_elements_from_element(): - driver = webdriver.Chrome() - driver.get('https://www.example.com') - - element = driver.find_element(By.TAG_NAME, 'div') - elements = element.find_elements(By.TAG_NAME, 'p') - for e in elements: - print(e.text) + form = driver.find_element(By.TAG_NAME, 'form') + elements = form.find_elements(By.TAG_NAME, 'input') + for element in elements: + print(element.get_attribute('value')) assert len(elements) > 0 - driver.quit() +def test_get_active_element(driver): + driver.get(LOCATORS_PAGE) -def test_get_active_element(): - driver = webdriver.Chrome() - driver.get('https://www.selenium.dev/selenium/web/web-form.html') - - driver.find_element(By.CSS_SELECTOR, '[name="my-text"]').send_keys('webElement') + driver.find_element(By.CSS_SELECTOR, '#fname').send_keys('webElement') attr = driver.switch_to.active_element.get_attribute('name') - assert attr == 'my-text' - - driver.quit() + assert attr == 'fname' diff --git a/examples/ruby/spec/elements/finders_spec.rb b/examples/ruby/spec/elements/finders_spec.rb index c0540635e86..ca10461e326 100644 --- a/examples/ruby/spec/elements/finders_spec.rb +++ b/examples/ruby/spec/elements/finders_spec.rb @@ -4,41 +4,61 @@ RSpec.describe 'Element Finders' do let(:driver) { start_session } + let(:locators_page) { 'https://www.selenium.dev/selenium/web/locators_tests/locators.html' } - context 'without executing finders', skip: 'these are just examples, not actual tests' do - it 'finds the first matching element' do - driver.find_element(class: 'tomatoes') - end - - it 'uses a subset of the dom to find an element' do - fruits = driver.find_element(id: 'fruits') - fruits.find_element(class: 'tomatoes') - end - - it 'uses an optimized locator' do - driver.find_element(css: '#fruits .tomatoes') - end - - it 'finds all matching elements' do - driver.find_elements(tag_name: 'li') - end - - # rubocop:disable RSpec/Output - it 'gets an element from a collection' do - elements = driver.find_elements(:tag_name, 'p') - elements.each { |e| puts e.text } - end - - it 'finds element from element' do - element = driver.find_element(:tag_name, 'div') - elements = element.find_elements(:tag_name, 'p') - elements.each { |e| puts e.text } - end - # rubocop:enable RSpec/Output - - it 'find active element' do - driver.find_element(css: '[name="q"]').send_keys('webElement') - driver.switch_to.active_element.attribute('title') - end + it 'finds the first matching element' do + driver.navigate.to locators_page + first_input = driver.find_element(class: 'information') + + expect(first_input.attribute('id')).to eq('fname') + end + + it 'uses a subset of the dom to find an element' do + driver.navigate.to locators_page + form = driver.find_element(tag_name: 'form') + input_element = form.find_element(class: 'information') + + expect(input_element.attribute('id')).to eq('fname') + end + + it 'uses an optimized locator' do + driver.navigate.to locators_page + input_element = driver.find_element(css: 'form .information') + + expect(input_element.attribute('id')).to eq('fname') + end + + it 'finds all matching elements' do + driver.navigate.to locators_page + inputs = driver.find_elements(tag_name: 'input') + + expect(inputs.size).to be > 1 + end + + # rubocop:disable RSpec/Output + it 'gets an element from a collection' do + driver.navigate.to locators_page + elements = driver.find_elements(tag_name: 'p') + elements.each { |e| puts "Paragraph text:#{e.text}" } + + expect(elements).not_to be_empty + end + + it 'finds element from element' do + driver.navigate.to locators_page + form = driver.find_element(tag_name: 'form') + elements = form.find_elements(tag_name: 'input') + elements.each { |e| puts e.attribute('value') } + + expect(elements).not_to be_empty + end + # rubocop:enable RSpec/Output + + it 'finds the active element' do + driver.navigate.to locators_page + driver.find_element(css: '#fname').send_keys('webElement') + attr = driver.switch_to.active_element.attribute('name') + + expect(attr).to eq('fname') end end diff --git a/website_and_docs/content/documentation/webdriver/elements/finders.en.md b/website_and_docs/content/documentation/webdriver/elements/finders.en.md index 0bf1c9b031e..a875d2f7a62 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.en.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.en.md @@ -12,22 +12,8 @@ description: > One of the most fundamental aspects of using Selenium is obtaining element references to work with. Selenium offers a number of built-in [locator strategies]({{< ref "locators.md" >}}) to uniquely identify an element. -There are many ways to use the locators in very advanced scenarios. For the purposes of this documentation, -let's consider this HTML snippet: - - -```html -
    -
  1. … -
  2. … -
  3. Tomato is a Vegetable… -
- -``` +There are many ways to use the locators in very advanced scenarios. For the purposes of this documentation, +use the [Selenium locator test page](https://www.selenium.dev/selenium/web/locators_tests/locators.html). ## First matching element @@ -38,28 +24,32 @@ first element found within a given context. When the find element method is called on the driver instance, it returns a reference to the first element in the DOM that matches with the provided locator. -This value can be stored and used for future element actions. In our example HTML above, there are -two elements that have a class name of "tomatoes" so this method will return the element in the "vegetables" list. +This value can be stored and used for future element actions. On the Selenium locator test page, there are +two elements with the class name `information`, so this method returns the first text input. {{< tabpane langEqualsHeader=true >}} {{< badge-examples >}} {{< tab header="Java" >}} -WebElement vegetable = driver.findElement(By.className("tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement firstInput = driver.findElement(By.className("information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L23">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L7-L8">}} {{< /tab >}} {{< tab header="CSharp" >}} -var vegetable = driver.FindElement(By.ClassName("tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +var firstInput = driver.FindElement(By.ClassName("information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L14-L15">}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L10-L11" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const vegetable = await driver.findElement(By.className('tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const firstInput = await driver.findElement(By.className('information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val vegetable: WebElement = driver.findElement(By.className("tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val firstInput: WebElement = driver.findElement(By.className("information")) {{< /tab >}} {{< /tabpane >}} @@ -67,35 +57,37 @@ val vegetable: WebElement = driver.findElement(By.className("tomatoes")) ### Evaluating a subset of the DOM Rather than finding a unique locator in the entire DOM, it is often useful to narrow the search to the scope -of another located element. In the above example there are two elements with a class name of "tomatoes" and -it is a little more challenging to get the reference for the second one. +of another located element. -One solution is to locate an element with a unique attribute that is an ancestor of the desired element and not an -ancestor of the undesired element, then call find element on that object: +One solution is to locate an ancestor of the desired element, then call find element on that object: {{< tabpane langEqualsHeader=true >}} {{< badge-examples >}} {{< tab header="Java" >}} -WebElement fruits = driver.findElement(By.id("fruits")); -WebElement fruit = fruits.findElement(By.className("tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement form = driver.findElement(By.tagName("form")); +WebElement input = form.findElement(By.className("information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L28-L29">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L14-L16">}} {{< /tab >}} {{< tab header="CSharp" >}} -IWebElement fruits = driver.FindElement(By.Id("fruits")); -IWebElement fruit = fruits.FindElement(By.ClassName("tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +IWebElement form = driver.FindElement(By.TagName("form")); +IWebElement input = form.FindElement(By.ClassName("information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L14-L15">}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L17-L19" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const fruits = await driver.findElement(By.id('fruits')); -const fruit = fruits.findElement(By.className('tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const form = await driver.findElement(By.tagName('form')); +const input = await form.findElement(By.className('information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val fruits = driver.findElement(By.id("fruits")) -val fruit = fruits.findElement(By.className("tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val form = driver.findElement(By.tagName("form")) +val input = form.findElement(By.className("information")) {{< /tab >}} {{< /tabpane >}} @@ -121,7 +113,7 @@ SearchContext shadowRoot = shadowHost.getShadowRoot(); WebElement shadowContent = shadowRoot.findElement(By.cssSelector("#shadow_content")); {{< /tab >}} {{< tab header="Python" text=true >}} -{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L50">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39-L42">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -150,27 +142,31 @@ To improve the performance slightly, we can use either CSS or XPath to find this See the [Locator strategy suggestions]({{< ref "/documentation/test_practices/encouraged/locators" >}}) in our [Encouraged test practices]({{< ref "/documentation/test_practices/encouraged" >}}) section. -For this example, we'll use a CSS Selector: +For this example, we'll use a CSS selector: {{< tabpane langEqualsHeader=true >}} {{< badge-examples >}} {{< tab header="Java" >}} -WebElement fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement input = driver.findElement(By.cssSelector("form .information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L34" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L22-L23">}} {{< /tab >}} {{< tab header="CSharp" >}} -var fruit = driver.FindElement(By.CssSelector("#fruits .tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +var input = driver.FindElement(By.CssSelector("form .information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L19" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L25-L26" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const fruit = await driver.findElement(By.css('#fruits .tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const input = await driver.findElement(By.css('form .information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val input = driver.findElement(By.cssSelector("form .information")) {{< /tab >}} {{< /tabpane >}} @@ -180,27 +176,31 @@ val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) There are several use cases for needing to get references to all elements that match a locator, rather than just the first one. The plural find elements methods return a collection of element references. If there are no matches, an empty list is returned. In this case, -references to all fruits and vegetable list items will be returned in a collection. +references to all input elements will be returned in a collection. {{< tabpane langEqualsHeader=true >}} {{< badge-examples >}} {{< tab header="Java" >}} -List plants = driver.findElements(By.tagName("li")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +List inputs = driver.findElements(By.tagName("input")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L29-L30">}} {{< /tab >}} {{< tab header="CSharp" >}} -IReadOnlyList plants = driver.FindElements(By.TagName("li")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +IReadOnlyList inputs = driver.FindElements(By.TagName("input")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L23" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L32-L33" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const plants = await driver.findElements(By.tagName('li')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const inputs = await driver.findElements(By.tagName('input')); {{< /tab >}} {{< tab header="Kotlin" >}} -val plants: List = driver.findElements(By.tagName("li")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val inputs: List = driver.findElements(By.tagName("input")) {{< /tab >}} {{< /tabpane >}} @@ -212,14 +212,15 @@ need to iterate over the collection and identify the one you want. {{< tabpane langEqualsHeader=true >}} {{< badge-examples >}} {{< tab header="Java" >}} -List elements = driver.findElements(By.tagName("li")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +List elements = driver.findElements(By.tagName("p")); for (WebElement element : elements) { System.out.println("Paragraph text:" + element.getText()); } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L62-L64" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L51-L53">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -232,7 +233,7 @@ namespace FindElementsExample { IWebDriver driver = new FirefoxDriver(); try { // Navigate to Url - driver.Navigate().GoToUrl("https://example.com"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); // Get all the elements available with tag name 'p' IList < IWebElement > elements = driver.FindElements(By.TagName("p")); @@ -248,7 +249,7 @@ namespace FindElementsExample { } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L28-L29" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L40-L42" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); @@ -256,7 +257,7 @@ const {Builder, By} = require('selenium-webdriver'); let driver = await new Builder().forBrowser('firefox').build(); try { // Navigate to Url - await driver.get('https://www.example.com'); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); // Get all the elements available with tag 'p' let elements = await driver.findElements(By.css('p')); @@ -276,7 +277,7 @@ import org.openqa.selenium.firefox.FirefoxDriver fun main() { val driver = FirefoxDriver() try { - driver.get("https://example.com") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") // Get all the elements available with tag name 'p' val elements = driver.findElements(By.tagName("p")) for (element in elements) { @@ -307,15 +308,15 @@ To achieve this, the parent WebElement is chained with 'findElements' to access public static void main(String[] args) { WebDriver driver = new ChromeDriver(); try { - driver.get("https://example.com"); + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); - // Get element with tag name 'div' - WebElement element = driver.findElement(By.tagName("div")); + // Get the form element + WebElement element = driver.findElement(By.tagName("form")); - // Get all the elements available with tag name 'p' - List elements = element.findElements(By.tagName("p")); + // Get all input elements in the form + List elements = element.findElements(By.tagName("input")); for (WebElement e : elements) { - System.out.println(e.getText()); + System.out.println(e.getAttribute("value")); } } finally { driver.quit(); @@ -324,7 +325,7 @@ To achieve this, the parent WebElement is chained with 'findElements' to access } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L75-L78" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L61-L64">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -336,15 +337,15 @@ namespace FindElementsFromElement { public static void Main(string[] args) { IWebDriver driver = new ChromeDriver(); try { - driver.Navigate().GoToUrl("https://example.com"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); - // Get element with tag name 'div' - IWebElement element = driver.FindElement(By.TagName("div")); + // Get the form element + IWebElement element = driver.FindElement(By.TagName("form")); - // Get all the elements available with tag name 'p' - IList < IWebElement > elements = element.FindElements(By.TagName("p")); + // Get all input elements in the form + IList < IWebElement > elements = element.FindElements(By.TagName("input")); foreach(IWebElement e in elements) { - System.Console.WriteLine(e.Text); + System.Console.WriteLine(e.GetAttribute("value")); } } finally { driver.Quit(); @@ -354,7 +355,7 @@ namespace FindElementsFromElement { } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L33-L35" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L48-L51" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); @@ -364,15 +365,15 @@ namespace FindElementsFromElement { .forBrowser('chrome') .build(); - await driver.get('https://www.example.com'); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); - // Get element with tag name 'div' - let element = driver.findElement(By.css("div")); + // Get the form element + let element = driver.findElement(By.css("form")); - // Get all the elements available with tag name 'p' - let elements = await element.findElements(By.css("p")); + // Get all input elements in the form + let elements = await element.findElements(By.css("input")); for(let e of elements) { - console.log(await e.getText()); + console.log(await e.getAttribute("value")); } })(); {{< /tab >}} @@ -383,15 +384,15 @@ namespace FindElementsFromElement { fun main() { val driver = ChromeDriver() try { - driver.get("https://example.com") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") - // Get element with tag name 'div' - val element = driver.findElement(By.tagName("div")) + // Get the form element + val element = driver.findElement(By.tagName("form")) - // Get all the elements available with tag name 'p' - val elements = element.findElements(By.tagName("p")) + // Get all input elements in the form + val elements = element.findElements(By.tagName("input")) for (e in elements) { - println(e.text) + println(e.getAttribute("value")) } } finally { driver.quit() @@ -414,11 +415,11 @@ It is used to track (or) find DOM element which has the focus in the current bro public static void main(String[] args) { WebDriver driver = new ChromeDriver(); try { - driver.get("http://www.google.com"); - driver.findElement(By.cssSelector("[name='q']")).sendKeys("webElement"); + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); + driver.findElement(By.cssSelector("#fname")).sendKeys("webElement"); // Get attribute of current active element - String attr = driver.switchTo().activeElement().getAttribute("title"); + String attr = driver.switchTo().activeElement().getAttribute("name"); System.out.println(attr); } finally { driver.quit(); @@ -427,7 +428,7 @@ It is used to track (or) find DOM element which has the focus in the current bro } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L89-L90" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L72-L73">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -439,11 +440,11 @@ It is used to track (or) find DOM element which has the focus in the current bro IWebDriver driver = new ChromeDriver(); try { // Navigate to Url - driver.Navigate().GoToUrl("https://www.google.com"); - driver.FindElement(By.CssSelector("[name='q']")).SendKeys("webElement"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); + driver.FindElement(By.CssSelector("#fname")).SendKeys("webElement"); // Get attribute of current active element - string attr = driver.SwitchTo().ActiveElement().GetAttribute("title"); + string attr = driver.SwitchTo().ActiveElement().GetAttribute("name"); System.Console.WriteLine(attr); } finally { driver.Quit(); @@ -453,18 +454,18 @@ It is used to track (or) find DOM element which has the focus in the current bro } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L40-L41" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L58-L60" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); (async function example() { let driver = await new Builder().forBrowser('chrome').build(); - await driver.get('https://www.google.com'); - await driver.findElement(By.css('[name="q"]')).sendKeys("webElement"); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); + await driver.findElement(By.css('#fname')).sendKeys("webElement"); // Get attribute of current active element - let attr = await driver.switchTo().activeElement().getAttribute("title"); + let attr = await driver.switchTo().activeElement().getAttribute("name"); console.log(`${attr}`) })(); {{< /tab >}} @@ -475,11 +476,11 @@ It is used to track (or) find DOM element which has the focus in the current bro fun main() { val driver = ChromeDriver() try { - driver.get("https://www.google.com") - driver.findElement(By.cssSelector("[name='q']")).sendKeys("webElement") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") + driver.findElement(By.cssSelector("#fname")).sendKeys("webElement") // Get attribute of current active element - val attr = driver.switchTo().activeElement().getAttribute("title") + val attr = driver.switchTo().activeElement().getAttribute("name") print(attr) } finally { driver.quit() diff --git a/website_and_docs/content/documentation/webdriver/elements/finders.ja.md b/website_and_docs/content/documentation/webdriver/elements/finders.ja.md index 933571f9d0e..53dd2ce0b5a 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.ja.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.ja.md @@ -13,20 +13,7 @@ description: > Seleniumを使用する最も基本的な側面の1つは、操作する要素の参照を取得することです。 Seleniumは、要素を一意に識別するための多数の組み込み[ロケーター戦略]({{< ref "locators.md" >}})を提供します。 非常に高度なシナリオでロケーターを使用する方法はたくさんあります。 -このドキュメントの目的のために、このHTMLスニペットについて考えてみましょう。 - -```html -
    -
  1. … -
  2. … -
  3. Tomato is a Vegetable… -
-
    -
  • … -
  • … -
  • Tomato is a Fruit… -
-``` +このドキュメントの目的のために、[Seleniumロケーターテストページ](https://www.selenium.dev/selenium/web/locators_tests/locators.html)を使用します。 ## 最初に一致する要素 @@ -37,59 +24,68 @@ Seleniumは、要素を一意に識別するための多数の組み込み[ロ ドライバーインスタンスで要素の検索メソッドが呼び出されると、提供されたロケーターと一致するDOMの最初の要素への参照が返されます。 この値は保存して、将来の要素アクションに使用できます。 -上記のHTMLの例では、クラス名が "tomatoes" の要素が2つあるため、このメソッドは "vegetables" リストの要素を返します。 +Seleniumロケーターテストページには、クラス名が `information` の要素が2つあるため、このメソッドは最初のテキスト入力を返します。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -WebElement vegetable = driver.findElement(By.className("tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement firstInput = driver.findElement(By.className("information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L23">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L7-L8">}} {{< /tab >}} {{< tab header="CSharp" >}} -var vegetable = driver.FindElement(By.ClassName("tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +var firstInput = driver.FindElement(By.ClassName("information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L10" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L10-L11" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const vegetable = await driver.findElement(By.className('tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const firstInput = await driver.findElement(By.className('information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val vegetable: WebElement = driver.findElement(By.className("tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val firstInput: WebElement = driver.findElement(By.className("information")) {{< /tab >}} {{< /tabpane >}} ### DOMのサブセットの評価 -DOM全体で一意のロケーターを見つけるのではなく、検索を別の検索された要素のスコープに絞り込むと便利なことがよくあります。 -上記の例では、クラス名が "トマト" の2つの要素があり、2番目の要素の参照を取得するのは少し困難です。 +DOM全体で一意のロケーターを見つけるのではなく、検索を別の検索された要素のスコープに絞り込むと便利なことがよくあります。 -1つの解決策は、目的の要素の祖先であり、不要な要素の祖先ではない一意の属性を持つ要素を見つけて、そのオブジェクトでfind要素を呼び出すことです。 +1つの解決策は、目的の要素の祖先を見つけて、そのオブジェクトでfind要素を呼び出すことです。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -WebElement fruits = driver.findElement(By.id("fruits")); -WebElement fruit = fruits.findElement(By.className("tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement form = driver.findElement(By.tagName("form")); +WebElement input = form.findElement(By.className("information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L28-L29">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L14-L16">}} {{< /tab >}} {{< tab header="CSharp" >}} -IWebElement fruits = driver.FindElement(By.Id("fruits")); -IWebElement fruit = fruits.FindElement(By.ClassName("tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +IWebElement form = driver.FindElement(By.TagName("form")); +IWebElement input = form.FindElement(By.ClassName("information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L14-L15" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L17-L19" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const fruits = await driver.findElement(By.id('fruits')); -const fruit = fruits.findElement(By.className('tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const form = await driver.findElement(By.tagName('form')); +const input = await form.findElement(By.className('information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val fruits = driver.findElement(By.id("fruits")) -val fruit = fruits.findElement(By.className("tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val form = driver.findElement(By.tagName("form")) +val input = form.findElement(By.className("information")) {{< /tab >}} {{< /tabpane >}} @@ -114,7 +110,7 @@ SearchContext shadowRoot = shadowHost.getShadowRoot(); WebElement shadowContent = shadowRoot.findElement(By.cssSelector("#shadow_content")); {{< /tab >}} {{< tab header="Python" text=true >}} -{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L50">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39-L42">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -144,23 +140,28 @@ shadow_content = shadow_root.find_element(css: '#shadow_content') この例では、CSSセレクターを使用します。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -WebElement fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement input = driver.findElement(By.cssSelector("form .information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L34" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L22-L23">}} {{< /tab >}} {{< tab header="CSharp" >}} -var fruit = driver.FindElement(By.CssSelector("#fruits .tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +var input = driver.FindElement(By.CssSelector("form .information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L19" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L25-L26" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const fruit = await driver.findElement(By.css('#fruits .tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const input = await driver.findElement(By.css('form .information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val input = driver.findElement(By.cssSelector("form .information")) {{< /tab >}} {{< /tabpane >}} @@ -170,26 +171,31 @@ val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) 最初の要素だけでなく、ロケーターに一致するすべての要素への参照を取得する必要があるユースケースがいくつかあります。 複数の要素の検索メソッドは、要素参照のコレクションを返します。 一致するものがない場合は、空のリストが返されます。 -この場合、すべてのfruitsとvegetableのリストアイテムへの参照がコレクションに返されます。 +この場合、すべてのinput要素への参照がコレクションに返されます。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -List plants = driver.findElements(By.tagName("li")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +List inputs = driver.findElements(By.tagName("input")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L29-L30">}} {{< /tab >}} {{< tab header="CSharp" >}} -IReadOnlyList plants = driver.FindElements(By.TagName("li")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +IReadOnlyList inputs = driver.FindElements(By.TagName("input")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L23" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L32-L33" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const plants = await driver.findElements(By.tagName('li')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const inputs = await driver.findElements(By.tagName('input')); {{< /tab >}} {{< tab header="Kotlin" >}} -val plants: List = driver.findElements(By.tagName("li")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val inputs: List = driver.findElements(By.tagName("input")) {{< /tab >}} {{< /tabpane >}} @@ -198,15 +204,17 @@ val plants: List = driver.findElements(By.tagName("li")) 必要な要素を特定する必要があります。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -List elements = driver.findElements(By.tagName("li")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +List elements = driver.findElements(By.tagName("p")); for (WebElement element : elements) { System.out.println("Paragraph text:" + element.getText()); } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L62-L64" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L51-L53">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -219,7 +227,7 @@ namespace FindElementsExample { IWebDriver driver = new FirefoxDriver(); try { // Navigate to Url - driver.Navigate().GoToUrl("https://example.com"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); // Get all the elements available with tag name 'p' IList < IWebElement > elements = driver.FindElements(By.TagName("p")); @@ -235,7 +243,7 @@ namespace FindElementsExample { } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L28-L29" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L40-L42" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); @@ -243,7 +251,7 @@ const {Builder, By} = require('selenium-webdriver'); let driver = await new Builder().forBrowser('firefox').build(); try { // Navigate to Url - await driver.get('https://www.example.com'); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); // Get all the elements available with tag 'p' let elements = await driver.findElements(By.css('p')); @@ -263,7 +271,7 @@ import org.openqa.selenium.firefox.FirefoxDriver fun main() { val driver = FirefoxDriver() try { - driver.get("https://example.com") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") // Get all the elements available with tag name 'p' val elements = driver.findElements(By.tagName("p")) for (element in elements) { @@ -282,6 +290,7 @@ fun main() { これを実現するために、親WebElementは'findElements'と連鎖して子要素にアクセスします。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; @@ -293,15 +302,15 @@ fun main() { public static void main(String[] args) { WebDriver driver = new ChromeDriver(); try { - driver.get("https://example.com"); + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); - // Get element with tag name 'div' - WebElement element = driver.findElement(By.tagName("div")); + // Get the form element + WebElement element = driver.findElement(By.tagName("form")); - // Get all the elements available with tag name 'p' - List elements = element.findElements(By.tagName("p")); + // Get all input elements in the form + List elements = element.findElements(By.tagName("input")); for (WebElement e : elements) { - System.out.println(e.getText()); + System.out.println(e.getAttribute("value")); } } finally { driver.quit(); @@ -310,7 +319,7 @@ fun main() { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L75-L78" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L61-L64">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -322,15 +331,15 @@ namespace FindElementsFromElement { public static void Main(string[] args) { IWebDriver driver = new ChromeDriver(); try { - driver.Navigate().GoToUrl("https://example.com"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); - // Get element with tag name 'div' - IWebElement element = driver.FindElement(By.TagName("div")); + // Get the form element + IWebElement element = driver.FindElement(By.TagName("form")); - // Get all the elements available with tag name 'p' - IList < IWebElement > elements = element.FindElements(By.TagName("p")); + // Get all input elements in the form + IList < IWebElement > elements = element.FindElements(By.TagName("input")); foreach(IWebElement e in elements) { - System.Console.WriteLine(e.Text); + System.Console.WriteLine(e.GetAttribute("value")); } } finally { driver.Quit(); @@ -340,7 +349,7 @@ namespace FindElementsFromElement { } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L33-L35" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L48-L51" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); @@ -350,15 +359,15 @@ namespace FindElementsFromElement { .forBrowser('chrome') .build(); - await driver.get('https://www.example.com'); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); - // Get element with tag name 'div' - let element = driver.findElement(By.css("div")); + // Get the form element + let element = driver.findElement(By.css("form")); - // Get all the elements available with tag name 'p' - let elements = await element.findElements(By.css("p")); + // Get all input elements in the form + let elements = await element.findElements(By.css("input")); for(let e of elements) { - console.log(await e.getText()); + console.log(await e.getAttribute("value")); } })(); {{< /tab >}} @@ -369,15 +378,15 @@ namespace FindElementsFromElement { fun main() { val driver = ChromeDriver() try { - driver.get("https://example.com") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") - // Get element with tag name 'div' - val element = driver.findElement(By.tagName("div")) + // Get the form element + val element = driver.findElement(By.tagName("form")) - // Get all the elements available with tag name 'p' - val elements = element.findElements(By.tagName("p")) + // Get all input elements in the form + val elements = element.findElements(By.tagName("input")) for (e in elements) { - println(e.text) + println(e.getAttribute("value")) } } finally { driver.quit() @@ -391,6 +400,7 @@ namespace FindElementsFromElement { これは、現在のブラウジングコンテキストでフォーカスを持っているDOM要素を追跡(または)検索するために使用されます。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; @@ -399,11 +409,11 @@ namespace FindElementsFromElement { public static void main(String[] args) { WebDriver driver = new ChromeDriver(); try { - driver.get("http://www.google.com"); - driver.findElement(By.cssSelector("[name='q']")).sendKeys("webElement"); + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); + driver.findElement(By.cssSelector("#fname")).sendKeys("webElement"); // Get attribute of current active element - String attr = driver.switchTo().activeElement().getAttribute("title"); + String attr = driver.switchTo().activeElement().getAttribute("name"); System.out.println(attr); } finally { driver.quit(); @@ -412,7 +422,7 @@ namespace FindElementsFromElement { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L89-L90" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L72-L73">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -424,11 +434,11 @@ namespace FindElementsFromElement { IWebDriver driver = new ChromeDriver(); try { // Navigate to Url - driver.Navigate().GoToUrl("https://www.google.com"); - driver.FindElement(By.CssSelector("[name='q']")).SendKeys("webElement"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); + driver.FindElement(By.CssSelector("#fname")).SendKeys("webElement"); // Get attribute of current active element - string attr = driver.SwitchTo().ActiveElement().GetAttribute("title"); + string attr = driver.SwitchTo().ActiveElement().GetAttribute("name"); System.Console.WriteLine(attr); } finally { driver.Quit(); @@ -438,18 +448,18 @@ namespace FindElementsFromElement { } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L40-L41" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L58-L60" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); (async function example() { let driver = await new Builder().forBrowser('chrome').build(); - await driver.get('https://www.google.com'); - await driver.findElement(By.css('[name="q"]')).sendKeys("webElement"); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); + await driver.findElement(By.css('#fname')).sendKeys("webElement"); // Get attribute of current active element - let attr = await driver.switchTo().activeElement().getAttribute("title"); + let attr = await driver.switchTo().activeElement().getAttribute("name"); console.log(`${attr}`) })(); {{< /tab >}} @@ -460,11 +470,11 @@ namespace FindElementsFromElement { fun main() { val driver = ChromeDriver() try { - driver.get("https://www.google.com") - driver.findElement(By.cssSelector("[name='q']")).sendKeys("webElement") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") + driver.findElement(By.cssSelector("#fname")).sendKeys("webElement") // Get attribute of current active element - val attr = driver.switchTo().activeElement().getAttribute("title") + val attr = driver.switchTo().activeElement().getAttribute("name") print(attr) } finally { driver.quit() diff --git a/website_and_docs/content/documentation/webdriver/elements/finders.pt-br.md b/website_and_docs/content/documentation/webdriver/elements/finders.pt-br.md index a2daa535496..418de7a1730 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.pt-br.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.pt-br.md @@ -13,21 +13,7 @@ description: > Um dos aspectos mais fundamentais do uso do Selenium é obter referências de elementos para trabalhar. O Selenium oferece várias [estratégias de localizador]({{< ref "locators.md" >}}) para identificar exclusivamente um elemento. Há muitas maneiras de usar os localizadores em cenários complexos. Para os propósitos desta documentação, -vamos considerar este trecho de HTML: - - -```html -
    -
  1. … -
  2. … -
  3. O tomate é um vegetal… -
-
    -
  • … -
  • … -
  • O tomate é uma fruta… -
-``` +use a [página de teste de localizadores do Selenium](https://www.selenium.dev/selenium/web/locators_tests/locators.html). ## Primeiro Elemento correspondente Muitos localizadores irão corresponder a vários elementos na página. @@ -37,61 +23,69 @@ primeiro elemento encontrado dentro de um determinado contexto. ### Avaliando o DOM inteiro Quando o metodo find element é chamado na instância do driver, ele retorna uma referência ao primeiro elemento no DOM que corresponde ao localizador fornecido. -Esse valor pode ser guardado e usado para ações futuras do elemento. Em nosso exemplo HTML acima, existem -dois elementos que têm um nome de classe de "tomatoes" então este método retornará o elemento na lista "vegetables". +Esse valor pode ser guardado e usado para ações futuras do elemento. Na página de teste de localizadores do Selenium, existem +dois elementos com o nome de classe `information`, então este método retorna o primeiro campo de texto. {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -WebElement vegetable = driver.findElement(By.className("tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement firstInput = driver.findElement(By.className("information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L23">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L7-L8">}} {{< /tab >}} {{< tab header="CSharp" >}} -var vegetable = driver.FindElement(By.ClassName("tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +var firstInput = driver.FindElement(By.ClassName("information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L10" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L10-L11" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const vegetable = await driver.findElement(By.className('tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const firstInput = await driver.findElement(By.className('information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val vegetable: WebElement = driver.findElement(By.className("tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val firstInput: WebElement = driver.findElement(By.className("information")) {{< /tab >}} {{< /tabpane >}} ### Avaliando um subconjunto do DOM Ao em vez de tentar encontrar um localizador unico no DOM inteiro, normalmente é útil restringir a busca ao escopo de outro elemento -já localizado. No exemplo acima existem dois elementos com um nome de classe de "tomatoes" e -é um pouco mais desafiador obter a referência para o segundo. +já localizado. -Uma possível solução seria localizar um elemento com um atributo único que seja um ancestral do elemento desejado e não um -ancestral do elemento indesejado, então invoque o find element nesse objeto: +Uma possível solução seria localizar um ancestral do elemento desejado, então invoque o find element nesse objeto: {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -WebElement fruits = driver.findElement(By.id("fruits")); -WebElement fruit = fruits.findElement(By.className("tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement form = driver.findElement(By.tagName("form")); +WebElement input = form.findElement(By.className("information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L28-L29">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L14-L16">}} {{< /tab >}} {{< tab header="CSharp" >}} -IWebElement fruits = driver.FindElement(By.Id("fruits")); -IWebElement fruit = fruits.FindElement(By.ClassName("tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +IWebElement form = driver.FindElement(By.TagName("form")); +IWebElement input = form.FindElement(By.ClassName("information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L14-L15" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L17-L19" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const fruits = await driver.findElement(By.id('fruits')); -const fruit = fruits.findElement(By.className('tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const form = await driver.findElement(By.tagName('form')); +const input = await form.findElement(By.className('information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val fruits = driver.findElement(By.id("fruits")) -val fruit = fruits.findElement(By.className("tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val form = driver.findElement(By.tagName("form")) +val input = form.findElement(By.className("information")) {{< /tab >}} {{< /tabpane >}} @@ -117,7 +111,7 @@ SearchContext shadowRoot = shadowHost.getShadowRoot(); WebElement shadowContent = shadowRoot.findElement(By.cssSelector("#shadow_content")); {{< /tab >}} {{< tab header="Python" text=true >}} -{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L50">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39-L42">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -145,26 +139,31 @@ Para melhorar um pouco o desempenho, podemos usar CSS ou XPath para encontrar es Veja as [sugestões de estratégia do localizador]({{< ref "/documentation/test_practices/encouraged/locators" >}}) na nossa sessão de [Práticas de teste incentivadas]({{< ref "/documentation/test_practices/encouraged" >}}). -Para esse exemplo, utilizaremos o CSS Selector: +Para esse exemplo, utilizaremos um seletor CSS: {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -WebElement fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement input = driver.findElement(By.cssSelector("form .information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L34" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L22-L23">}} {{< /tab >}} {{< tab header="CSharp" >}} -var fruit = driver.FindElement(By.CssSelector("#fruits .tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +var input = driver.FindElement(By.CssSelector("form .information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L19" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L25-L26" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const fruit = await driver.findElement(By.css('#fruits .tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const input = await driver.findElement(By.css('form .information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val input = driver.findElement(By.cssSelector("form .information")) {{< /tab >}} {{< /tabpane >}} @@ -173,26 +172,31 @@ val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) Existem vários casos de uso para a necessidade de obter referências a todos os elementos que correspondem a um localizador, em vez do que apenas o primeiro. Os métodos plurais find elements retornam uma coleção de referências de elementos. Se não houver correspondências, uma lista vazia será retornada. Nesse caso, -referências a todos os itens da lista de frutas e vegetais serão devolvidas em uma coleção. +referências a todos os elementos input serão devolvidas em uma coleção. {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -List plants = driver.findElements(By.tagName("li")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +List inputs = driver.findElements(By.tagName("input")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L29-L30">}} {{< /tab >}} {{< tab header="CSharp" >}} -IReadOnlyList plants = driver.FindElements(By.TagName("li")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +IReadOnlyList inputs = driver.FindElements(By.TagName("input")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L23" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L32-L33" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const plants = await driver.findElements(By.tagName('li')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const inputs = await driver.findElements(By.tagName('input')); {{< /tab >}} {{< tab header="Kotlin" >}} -val plants: List = driver.findElements(By.tagName("li")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val inputs: List = driver.findElements(By.tagName("input")) {{< /tab >}} {{< /tabpane >}} @@ -202,15 +206,17 @@ precisa iterar sobre a coleção e identificar o que você deseja. {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -List elements = driver.findElements(By.tagName("li")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +List elements = driver.findElements(By.tagName("p")); for (WebElement element : elements) { System.out.println("Paragraph text:" + element.getText()); } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L62-L64" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L51-L53">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -223,7 +229,7 @@ namespace FindElementsExample { IWebDriver driver = new FirefoxDriver(); try { // Navegar até a URL - driver.Navigate().GoToUrl("https://example.com"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); // Obtém todos os elementos disponiveis com o nome da tag 'p' IList < IWebElement > elements = driver.FindElements(By.TagName("p")); @@ -239,7 +245,7 @@ namespace FindElementsExample { } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L28-L29" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L40-L42" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); @@ -247,7 +253,7 @@ const {Builder, By} = require('selenium-webdriver'); let driver = await new Builder().forBrowser('firefox').build(); try { // Navegar até a URL - await driver.get('https://www.example.com'); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); // Obtém todos os elementos disponiveis com o nome da tag 'p' let elements = await driver.findElements(By.css('p')); @@ -267,7 +273,7 @@ import org.openqa.selenium.firefox.FirefoxDriver fun main() { val driver = FirefoxDriver() try { - driver.get("https://example.com") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") // Obtém todos os elementos disponiveis com o nome da tag 'p' val elements = driver.findElements(By.tagName("p")) for (element in elements) { @@ -286,6 +292,7 @@ Ele é usado para localizar a lista de WebElements filhos correspondentes dentro Para realizar isso, o WebElement pai é encadeado com o 'findElements' para acessar seus elementos filhos. {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; @@ -297,15 +304,15 @@ Para realizar isso, o WebElement pai é encadeado com o 'findElements' para aces public static void main(String[] args) { WebDriver driver = new ChromeDriver(); try { - driver.get("https://example.com"); + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); - // Obtém o elemento com o nome da tag 'div' - WebElement element = driver.findElement(By.tagName("div")); + // Obtém o elemento form + WebElement element = driver.findElement(By.tagName("form")); - // Obtém todos os elementos disponiveis com o nome da tag 'p' - List elements = element.findElements(By.tagName("p")); + // Obtém todos os elementos input dentro do form + List elements = element.findElements(By.tagName("input")); for (WebElement e : elements) { - System.out.println(e.getText()); + System.out.println(e.getAttribute("value")); } } finally { driver.quit(); @@ -314,7 +321,7 @@ Para realizar isso, o WebElement pai é encadeado com o 'findElements' para aces } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L75-L78" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L61-L64">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -326,15 +333,15 @@ namespace FindElementsFromElement { public static void Main(string[] args) { IWebDriver driver = new ChromeDriver(); try { - driver.Navigate().GoToUrl("https://example.com"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); - // Obtém o elemento com o nome da tag 'div' - IWebElement element = driver.FindElement(By.TagName("div")); + // Obtém o elemento form + IWebElement element = driver.FindElement(By.TagName("form")); - // Obtém todos os elementos disponíveis com o nome da tag 'p' - IList < IWebElement > elements = element.FindElements(By.TagName("p")); + // Obtém todos os elementos input dentro do form + IList < IWebElement > elements = element.FindElements(By.TagName("input")); foreach(IWebElement e in elements) { - System.Console.WriteLine(e.Text); + System.Console.WriteLine(e.GetAttribute("value")); } } finally { driver.Quit(); @@ -344,7 +351,7 @@ namespace FindElementsFromElement { } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L33-L35" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L48-L51" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); @@ -354,15 +361,15 @@ namespace FindElementsFromElement { .forBrowser('chrome') .build(); - await driver.get('https://www.example.com'); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); - // Obtém o elemento com o nome da tag 'div' - let element = driver.findElement(By.css("div")); + // Obtém o elemento form + let element = driver.findElement(By.css("form")); - // Obtém todos os elementos disponíveis com o nome da tag 'p' - let elements = await element.findElements(By.css("p")); + // Obtém todos os elementos input dentro do form + let elements = await element.findElements(By.css("input")); for(let e of elements) { - console.log(await e.getText()); + console.log(await e.getAttribute("value")); } })(); {{< /tab >}} @@ -373,15 +380,15 @@ namespace FindElementsFromElement { fun main() { val driver = ChromeDriver() try { - driver.get("https://example.com") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") - // Obtém o elemento com o nome da tag 'div' - val element = driver.findElement(By.tagName("div")) + // Obtém o elemento form + val element = driver.findElement(By.tagName("form")) - // Obtém todos os elementos disponíveis com o nome da tag 'p' - val elements = element.findElements(By.tagName("p")) + // Obtém todos os elementos input dentro do form + val elements = element.findElements(By.tagName("input")) for (e in elements) { - println(e.text) + println(e.getAttribute("value")) } } finally { driver.quit() @@ -395,6 +402,7 @@ namespace FindElementsFromElement { Ele é usado para rastrear (ou) encontrar um elemento DOM que tem o foco no contexto de navegação atual. {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; @@ -403,11 +411,11 @@ Ele é usado para rastrear (ou) encontrar um elemento DOM que tem o foco no cont public static void main(String[] args) { WebDriver driver = new ChromeDriver(); try { - driver.get("http://www.google.com"); - driver.findElement(By.cssSelector("[name='q']")).sendKeys("webElement"); + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); + driver.findElement(By.cssSelector("#fname")).sendKeys("webElement"); // Obter atributo do elemento atualmente ativo - String attr = driver.switchTo().activeElement().getAttribute("title"); + String attr = driver.switchTo().activeElement().getAttribute("name"); System.out.println(attr); } finally { driver.quit(); @@ -416,7 +424,7 @@ Ele é usado para rastrear (ou) encontrar um elemento DOM que tem o foco no cont } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L89-L90" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L72-L73">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -428,11 +436,11 @@ Ele é usado para rastrear (ou) encontrar um elemento DOM que tem o foco no cont IWebDriver driver = new ChromeDriver(); try { // Navegar até a URL - driver.Navigate().GoToUrl("https://www.google.com"); - driver.FindElement(By.CssSelector("[name='q']")).SendKeys("webElement"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); + driver.FindElement(By.CssSelector("#fname")).SendKeys("webElement"); // Obter atributo do elemento atualmente ativo - string attr = driver.SwitchTo().ActiveElement().GetAttribute("title"); + string attr = driver.SwitchTo().ActiveElement().GetAttribute("name"); System.Console.WriteLine(attr); } finally { driver.Quit(); @@ -442,18 +450,18 @@ Ele é usado para rastrear (ou) encontrar um elemento DOM que tem o foco no cont } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L40-L41" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L58-L60" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); (async function example() { let driver = await new Builder().forBrowser('chrome').build(); - await driver.get('https://www.google.com'); - await driver.findElement(By.css('[name="q"]')).sendKeys("webElement"); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); + await driver.findElement(By.css('#fname')).sendKeys("webElement"); // Obter atributo do elemento atualmente ativo - let attr = await driver.switchTo().activeElement().getAttribute("title"); + let attr = await driver.switchTo().activeElement().getAttribute("name"); console.log(`${attr}`) })(); {{< /tab >}} @@ -464,11 +472,11 @@ Ele é usado para rastrear (ou) encontrar um elemento DOM que tem o foco no cont fun main() { val driver = ChromeDriver() try { - driver.get("https://www.google.com") - driver.findElement(By.cssSelector("[name='q']")).sendKeys("webElement") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") + driver.findElement(By.cssSelector("#fname")).sendKeys("webElement") // Obter atributo do elemento atualmente ativo - val attr = driver.switchTo().activeElement().getAttribute("title") + val attr = driver.switchTo().activeElement().getAttribute("name") print(attr) } finally { driver.quit() diff --git a/website_and_docs/content/documentation/webdriver/elements/finders.zh-cn.md b/website_and_docs/content/documentation/webdriver/elements/finders.zh-cn.md index 1633e2742cf..a513361ef55 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.zh-cn.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.zh-cn.md @@ -14,20 +14,7 @@ description: > 使用 Selenium 最基本的特点之一是获取可用于操作的元素引用。 Selenium 提供了许多内置的 [定位策略]({{< ref "locators.md" >}}),用于唯一标识元素。 在更复杂的场景中,可以用多种方式使用这些定位器。为了本篇文档的目的, -我们来考虑下面的 HTML 片段: - -```html -
    -
  1. … -
  2. … -
  3. Tomato is a Vegetable… -
-
    -
  • … -
  • … -
  • Tomato is a Fruit… -
-``` +请使用 [Selenium 定位器测试页面](https://www.selenium.dev/selenium/web/locators_tests/locators.html)。 ## 第一个匹配的元素 @@ -39,27 +26,32 @@ Selenium 提供了许多内置的 [定位策略]({{< ref "locators.md" >}}), 当在 driver 实例上调用 find element 方法时, 它会返回 DOM 中与所提供定位器匹配的第一个元素的引用。 该引用可以被保存并用于后续的元素操作。 -在上面的示例 HTML 中,有两个 class 名称为 "tomatoes" 的元素, -因此此方法会返回位于 "vegetables" 列表中的那个元素。 +在 Selenium 定位器测试页面上,有两个 class 名称为 `information` 的元素, +因此此方法会返回第一个文本输入框。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -WebElement vegetable = driver.findElement(By.className("tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement firstInput = driver.findElement(By.className("information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L23">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L7-L8">}} {{< /tab >}} {{< tab header="CSharp" >}} -var vegetable = driver.FindElement(By.ClassName("tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +var firstInput = driver.FindElement(By.ClassName("information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L10" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L10-L11" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const vegetable = await driver.findElement(By.className('tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const firstInput = await driver.findElement(By.className('information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val vegetable: WebElement = driver.findElement(By.className("tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val firstInput: WebElement = driver.findElement(By.className("information")) {{< /tab >}} {{< /tabpane >}} @@ -69,35 +61,37 @@ val vegetable: WebElement = driver.findElement(By.className("tomatoes")) 与其在整个 DOM 中寻找唯一的定位器, 通常更有用的是将搜索范围缩小到另一个已定位元素的作用域内。 -在上面的示例中,有两个 class 名为 "tomatoes" 的元素, -因此要获取第二个元素的引用会更具挑战性。 -一种解决办法是先定位一个具有唯一属性的元素, -该元素是目标元素的祖先但不是非目标元素的祖先, +一种解决办法是先定位目标元素的祖先, 然后在该对象上调用 `find element`: {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -WebElement fruits = driver.findElement(By.id("fruits")); -WebElement fruit = fruits.findElement(By.className("tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement form = driver.findElement(By.tagName("form")); +WebElement input = form.findElement(By.className("information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L28-L29">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L14-L16">}} {{< /tab >}} {{< tab header="CSharp" >}} -IWebElement fruits = driver.FindElement(By.Id("fruits")); -IWebElement fruit = fruits.FindElement(By.ClassName("tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +IWebElement form = driver.FindElement(By.TagName("form")); +IWebElement input = form.FindElement(By.ClassName("information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L14-L15" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L17-L19" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const fruits = await driver.findElement(By.id('fruits')); -const fruit = fruits.findElement(By.className('tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const form = await driver.findElement(By.tagName('form')); +const input = await form.findElement(By.className('information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val fruits = driver.findElement(By.id("fruits")) -val fruit = fruits.findElement(By.className("tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val form = driver.findElement(By.tagName("form")) +val input = form.findElement(By.className("information")) {{< /tab >}} {{< /tabpane >}} @@ -121,7 +115,7 @@ SearchContext shadowRoot = shadowHost.getShadowRoot(); WebElement shadowContent = shadowRoot.findElement(By.cssSelector("#shadow_content")); {{< /tab >}} {{< tab header="Python" text=true >}} -{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L50">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39-L42">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -153,23 +147,28 @@ shadow_content = shadow_root.find_element(css: '#shadow_content') 在本例中,我们将使用 CSS 选择器: {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -WebElement fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +WebElement input = driver.findElement(By.cssSelector("form .information")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L34" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L22-L23">}} {{< /tab >}} {{< tab header="CSharp" >}} -var fruit = driver.FindElement(By.CssSelector("#fruits .tomatoes")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +var input = driver.FindElement(By.CssSelector("form .information")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L19" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L25-L26" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const fruit = await driver.findElement(By.css('#fruits .tomatoes')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const input = await driver.findElement(By.css('form .information')); {{< /tab >}} {{< tab header="Kotlin" >}} -val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val input = driver.findElement(By.cssSelector("form .information")) {{< /tab >}} {{< /tabpane >}} @@ -179,26 +178,31 @@ val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) 在某些情况下,需要获取与定位器匹配的所有元素的引用,而不是仅获取第一个。 复数形式的 `find elements` 方法会返回一组元素引用。如果没有匹配项,则返回空列表。 -在本例中,将返回所有水果和蔬菜列表项的引用集合。 +在本例中,将返回所有 input 元素的引用集合。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -List plants = driver.findElements(By.tagName("li")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +List inputs = driver.findElements(By.tagName("input")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L29-L30">}} {{< /tab >}} {{< tab header="CSharp" >}} -IReadOnlyList plants = driver.FindElements(By.TagName("li")); +driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +IReadOnlyList inputs = driver.FindElements(By.TagName("input")); {{< /tab >}} {{< tab header="Ruby" text=true >}} -{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L23" >}} +{{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L32-L33" >}} {{< /tab >}} {{< tab header="JavaScript" >}} -const plants = await driver.findElements(By.tagName('li')); +await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); +const inputs = await driver.findElements(By.tagName('input')); {{< /tab >}} {{< tab header="Kotlin" >}} -val plants: List = driver.findElements(By.tagName("li")) +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") +val inputs: List = driver.findElements(By.tagName("input")) {{< /tab >}} {{< /tabpane >}} @@ -208,15 +212,17 @@ val plants: List = driver.findElements(By.tagName("li")) {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} -List elements = driver.findElements(By.tagName("li")); +driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); +List elements = driver.findElements(By.tagName("p")); for (WebElement element : elements) { System.out.println("Paragraph text:" + element.getText()); } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L62-L64" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L51-L53">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -229,7 +235,7 @@ namespace FindElementsExample { IWebDriver driver = new FirefoxDriver(); try { // Navigate to Url - driver.Navigate().GoToUrl("https://example.com"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); // Get all the elements available with tag name 'p' IList < IWebElement > elements = driver.FindElements(By.TagName("p")); @@ -245,7 +251,7 @@ namespace FindElementsExample { } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L28-L29" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L40-L42" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); @@ -253,7 +259,7 @@ const {Builder, By} = require('selenium-webdriver'); let driver = await new Builder().forBrowser('firefox').build(); try { // Navigate to Url - await driver.get('https://www.example.com'); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); // Get all the elements available with tag 'p' let elements = await driver.findElements(By.css('p')); @@ -273,7 +279,7 @@ import org.openqa.selenium.firefox.FirefoxDriver fun main() { val driver = FirefoxDriver() try { - driver.get("https://example.com") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") // Get all the elements available with tag name 'p' val elements = driver.findElements(By.tagName("p")) for (element in elements) { @@ -292,6 +298,7 @@ fun main() { 为此,可在父 WebElement 上链式调用 `findElements` 来访问子元素。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; @@ -303,15 +310,15 @@ fun main() { public static void main(String[] args) { WebDriver driver = new ChromeDriver(); try { - driver.get("https://example.com"); + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); - // Get element with tag name 'div' - WebElement element = driver.findElement(By.tagName("div")); + // Get the form element + WebElement element = driver.findElement(By.tagName("form")); - // Get all the elements available with tag name 'p' - List elements = element.findElements(By.tagName("p")); + // Get all input elements in the form + List elements = element.findElements(By.tagName("input")); for (WebElement e : elements) { - System.out.println(e.getText()); + System.out.println(e.getAttribute("value")); } } finally { driver.quit(); @@ -320,7 +327,7 @@ fun main() { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L75-L78" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L61-L64">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -332,15 +339,15 @@ namespace FindElementsFromElement { public static void Main(string[] args) { IWebDriver driver = new ChromeDriver(); try { - driver.Navigate().GoToUrl("https://example.com"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); - // Get element with tag name 'div' - IWebElement element = driver.FindElement(By.TagName("div")); + // Get the form element + IWebElement element = driver.FindElement(By.TagName("form")); - // Get all the elements available with tag name 'p' - IList < IWebElement > elements = element.FindElements(By.TagName("p")); + // Get all input elements in the form + IList < IWebElement > elements = element.FindElements(By.TagName("input")); foreach(IWebElement e in elements) { - System.Console.WriteLine(e.Text); + System.Console.WriteLine(e.GetAttribute("value")); } } finally { driver.Quit(); @@ -350,7 +357,7 @@ namespace FindElementsFromElement { } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L33-L35" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L48-L51" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); @@ -360,15 +367,15 @@ namespace FindElementsFromElement { .forBrowser('chrome') .build(); - await driver.get('https://www.example.com'); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); - // Get element with tag name 'div' - let element = driver.findElement(By.css("div")); + // Get the form element + let element = driver.findElement(By.css("form")); - // Get all the elements available with tag name 'p' - let elements = await element.findElements(By.css("p")); + // Get all input elements in the form + let elements = await element.findElements(By.css("input")); for(let e of elements) { - console.log(await e.getText()); + console.log(await e.getAttribute("value")); } })(); {{< /tab >}} @@ -379,15 +386,15 @@ namespace FindElementsFromElement { fun main() { val driver = ChromeDriver() try { - driver.get("https://example.com") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") - // Get element with tag name 'div' - val element = driver.findElement(By.tagName("div")) + // Get the form element + val element = driver.findElement(By.tagName("form")) - // Get all the elements available with tag name 'p' - val elements = element.findElements(By.tagName("p")) + // Get all input elements in the form + val elements = element.findElements(By.tagName("input")) for (e in elements) { - println(e.text) + println(e.getAttribute("value")) } } finally { driver.quit() @@ -401,6 +408,7 @@ namespace FindElementsFromElement { 用于跟踪或查找当前浏览上下文中具有焦点的 DOM 元素。 {{< tabpane langEqualsHeader=true >}} +{{< badge-examples >}} {{< tab header="Java" >}} import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; @@ -409,11 +417,11 @@ namespace FindElementsFromElement { public static void main(String[] args) { WebDriver driver = new ChromeDriver(); try { - driver.get("http://www.google.com"); - driver.findElement(By.cssSelector("[name='q']")).sendKeys("webElement"); + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); + driver.findElement(By.cssSelector("#fname")).sendKeys("webElement"); // Get attribute of current active element - String attr = driver.switchTo().activeElement().getAttribute("title"); + String attr = driver.switchTo().activeElement().getAttribute("name"); System.out.println(attr); } finally { driver.quit(); @@ -422,7 +430,7 @@ namespace FindElementsFromElement { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L89-L90" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L72-L73">}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -434,11 +442,11 @@ namespace FindElementsFromElement { IWebDriver driver = new ChromeDriver(); try { // Navigate to Url - driver.Navigate().GoToUrl("https://www.google.com"); - driver.FindElement(By.CssSelector("[name='q']")).SendKeys("webElement"); + driver.Navigate().GoToUrl("https://www.selenium.dev/selenium/web/locators_tests/locators.html"); + driver.FindElement(By.CssSelector("#fname")).SendKeys("webElement"); // Get attribute of current active element - string attr = driver.SwitchTo().ActiveElement().GetAttribute("title"); + string attr = driver.SwitchTo().ActiveElement().GetAttribute("name"); System.Console.WriteLine(attr); } finally { driver.Quit(); @@ -448,18 +456,18 @@ namespace FindElementsFromElement { } {{< /tab >}} {{< tab header="Ruby" text=true >}} - {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L40-L41" >}} + {{< gh-codeblock path="/examples/ruby/spec/elements/finders_spec.rb#L58-L60" >}} {{< /tab >}} {{< tab header="JavaScript" >}} const {Builder, By} = require('selenium-webdriver'); (async function example() { let driver = await new Builder().forBrowser('chrome').build(); - await driver.get('https://www.google.com'); - await driver.findElement(By.css('[name="q"]')).sendKeys("webElement"); + await driver.get('https://www.selenium.dev/selenium/web/locators_tests/locators.html'); + await driver.findElement(By.css('#fname')).sendKeys("webElement"); // Get attribute of current active element - let attr = await driver.switchTo().activeElement().getAttribute("title"); + let attr = await driver.switchTo().activeElement().getAttribute("name"); console.log(`${attr}`) })(); {{< /tab >}} @@ -470,11 +478,11 @@ namespace FindElementsFromElement { fun main() { val driver = ChromeDriver() try { - driver.get("https://www.google.com") - driver.findElement(By.cssSelector("[name='q']")).sendKeys("webElement") + driver.get("https://www.selenium.dev/selenium/web/locators_tests/locators.html") + driver.findElement(By.cssSelector("#fname")).sendKeys("webElement") // Get attribute of current active element - val attr = driver.switchTo().activeElement().getAttribute("title") + val attr = driver.switchTo().activeElement().getAttribute("name") print(attr) } finally { driver.quit()