From d2f612ee25b277399021f9ddf779a8250657a86f Mon Sep 17 00:00:00 2001 From: Pablo Martinez Date: Thu, 12 Dec 2024 17:06:48 -0800 Subject: [PATCH 1/6] Add code that is to be used in examples Moving the code to the appropriate files --- .../python/tests/elements/test_finders.py | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/examples/python/tests/elements/test_finders.py b/examples/python/tests/elements/test_finders.py index 53b695b6fc83..0874d993187a 100644 --- a/examples/python/tests/elements/test_finders.py +++ b/examples/python/tests/elements/test_finders.py @@ -1,2 +1,96 @@ from selenium import webdriver +from selenium.webdriver.common.by import By + + +def test_basic_finders(): + driver = webdriver.Chrome() + driver.get('https://www.selenium.dev/') + + body_on_page = driver.find_element(By.CLASS_NAME, 'td-home') + container_on_page = body_on_page.find_element(By.CLASS_NAME, 'container-fluid') + + assert container_on_page.is_displayed() + + driver.quit() + +def test_evaluating_shadow_DOM(): + driver = webdriver.Chrome() + driver.implicitly_wait(5) + driver.get('https://www.selenium.dev/selenium/web/shadowRootPage.html') + + # div_el = driver.find_element(By.TAG_NAME, 'body') + custom_element = driver.find_element(By.TAG_NAME, 'custom-checkbox-element') + assert custom_element.is_displayed() + print(custom_element.shadow_root) + assert custom_element.shadow_root + div_children = custom_element.shadow_root.find_element(By.CSS_SELECTOR, 'input[type=checkbox]') + print(div_children) + assert div_children.is_displayed() + + driver.quit() + +def test_optimized_locator(): + driver = webdriver.Chrome() + driver.get('https://www.selenium.dev/') + + nested_element = driver.find_element(By.CSS_SELECTOR, '.td-home #announcement-banner') + + assert nested_element.is_displayed() + + driver.quit() + +def test_all_matching_elements(): + driver = webdriver.Chrome() + driver.get('https://www.selenium.dev/') + + header_two_elements = driver.find_elements(By.TAG_NAME, 'h2') + + assert len(header_two_elements) > 1 + + for header_element in header_two_elements: + print(header_element.text) + + driver.quit() + +def test_find_elements_from_element(): + driver = webdriver.Chrome() + driver.get('https://www.selenium.dev/') + + main_element = driver.find_element(By.TAG_NAME, 'main') + svg_elements = main_element.find_elements(By.TAG_NAME, 'svg') + + assert len(svg_elements) > 1 + + for svg_element in svg_elements: + print(svg_element.is_displayed()) + + + ## get elements from parent element using XPATH + ## NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path + + header_tag = driver.find_element(By.TAG_NAME, 'header') + # Get first element of tag 'ul' + ul_tag = header_tag.find_element(By.XPATH, '//ul') + + # get children of tag 'ul' with tag 'li' + elements = ul_tag.find_elements(By.XPATH, './/li') + assert len(elements) > 0 + + for element in elements: + print(element.text) + + driver.quit() + +def test_get_active_element(): + driver = webdriver.Chrome() + driver.get('https://www.selenium.dev/') + + dropdown = driver.find_element(By.CSS_SELECTOR, '.nav-item.dropdown') + dropdown.click() + + active_element = driver.switch_to.active_element + + assert active_element.get_attribute('href').endswith('#') + + driver.quit() From fee6557835e91f848460a9d37b56d4edb7118ed3 Mon Sep 17 00:00:00 2001 From: Pablo Martinez Date: Thu, 12 Dec 2024 18:44:25 -0800 Subject: [PATCH 2/6] Updates to moving code for python Finders docs --- .../python/tests/elements/test_finders.py | 15 ++-- .../webdriver/elements/finders.en.md | 80 ++++--------------- .../webdriver/elements/finders.ja.md | 80 ++++--------------- .../webdriver/elements/finders.pt-br.md | 75 ++++------------- .../webdriver/elements/finders.zh-cn.md | 80 ++++--------------- 5 files changed, 70 insertions(+), 260 deletions(-) diff --git a/examples/python/tests/elements/test_finders.py b/examples/python/tests/elements/test_finders.py index 0874d993187a..a1d5c186adc7 100644 --- a/examples/python/tests/elements/test_finders.py +++ b/examples/python/tests/elements/test_finders.py @@ -18,14 +18,12 @@ def test_evaluating_shadow_DOM(): driver.implicitly_wait(5) driver.get('https://www.selenium.dev/selenium/web/shadowRootPage.html') - # div_el = driver.find_element(By.TAG_NAME, 'body') custom_element = driver.find_element(By.TAG_NAME, 'custom-checkbox-element') + shadow_dom_input = custom_element.shadow_root.find_element(By.CSS_SELECTOR, 'input[type=checkbox]') + assert custom_element.is_displayed() - print(custom_element.shadow_root) assert custom_element.shadow_root - div_children = custom_element.shadow_root.find_element(By.CSS_SELECTOR, 'input[type=checkbox]') - print(div_children) - assert div_children.is_displayed() + assert shadow_dom_input.is_displayed() driver.quit() @@ -59,12 +57,9 @@ def test_find_elements_from_element(): main_element = driver.find_element(By.TAG_NAME, 'main') svg_elements = main_element.find_elements(By.TAG_NAME, 'svg') - assert len(svg_elements) > 1 - for svg_element in svg_elements: print(svg_element.is_displayed()) - ## get elements from parent element using XPATH ## NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path @@ -74,10 +69,12 @@ def test_find_elements_from_element(): # get children of tag 'ul' with tag 'li' elements = ul_tag.find_elements(By.XPATH, './/li') - assert len(elements) > 0 for element in elements: print(element.text) + + assert len(elements) > 0 + assert len(svg_elements) > 1 driver.quit() 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 08f8d82da1c6..5089e56198b3 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.en.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.en.md @@ -46,8 +46,8 @@ two elements that have a class name of "tomatoes" so this method will return the {{< tab header="Java" >}} WebElement vegetable = driver.findElement(By.className("tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -vegetable = driver.find_element(By.CLASS_NAME, "tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9">}} {{< /tab >}} {{< tab header="CSharp" >}} var vegetable = driver.FindElement(By.ClassName("tomatoes")); @@ -79,9 +79,8 @@ ancestor of the undesired element, then call find element on that object: WebElement fruits = driver.findElement(By.id("fruits")); WebElement fruit = fruits.findElement(By.className("tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -fruits = driver.find_element(By.ID, "fruits") -fruit = fruits.find_element(By.CLASS_NAME,"tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9-L10">}} {{< /tab >}} {{< tab header="CSharp" >}} IWebElement fruits = driver.FindElement(By.Id("fruits")); @@ -121,10 +120,8 @@ WebElement shadowHost = driver.findElement(By.cssSelector("#shadow_host")); SearchContext shadowRoot = shadowHost.getShadowRoot(); WebElement shadowContent = shadowRoot.findElement(By.cssSelector("#shadow_content")); {{< /tab >}} -{{< tab header="Python" >}} -shadow_host = driver.find_element(By.CSS_SELECTOR, '#shadow_host') -shadow_root = shadow_host.shadow_root -shadow_content = shadow_root.find_element(By.CSS_SELECTOR, '#shadow_content') +{{< tab header="Python" text=true >}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L21-L22">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -160,8 +157,8 @@ For this example, we'll use a CSS Selector: {{< tab header="Java" >}} WebElement fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -fruit = driver.find_element(By.CSS_SELECTOR,"#fruits .tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L34" >}} {{< /tab >}} {{< tab header="CSharp" >}} var fruit = driver.FindElement(By.CssSelector("#fruits .tomatoes")); @@ -190,8 +187,8 @@ references to all fruits and vegetable list items will be returned in a collecti {{< tab header="Java" >}} List plants = driver.findElements(By.tagName("li")); {{< /tab >}} - {{< tab header="Python" >}} -plants = driver.find_elements(By.TAG_NAME, "li") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L44" >}} {{< /tab >}} {{< tab header="CSharp" >}} IReadOnlyList plants = driver.FindElements(By.TagName("li")); @@ -221,20 +218,8 @@ for (WebElement element : elements) { System.out.println("Paragraph text:" + element.getText()); } {{< /tab >}} - {{< tab header="Python" >}} -from selenium import webdriver -from selenium.webdriver.common.by import By - -driver = webdriver.Firefox() - - # Navigate to Url -driver.get("https://www.example.com") - - # Get all the elements available with tag name 'p' -elements = driver.find_elements(By.TAG_NAME, 'p') - -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L54-L61" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -338,32 +323,8 @@ To achieve this, the parent WebElement is chained with 'findElements' to access } } {{< /tab >}} - {{< tab header="Python" >}} -from selenium import webdriver -from selenium.webdriver.common.by import By - -driver = webdriver.Chrome() -driver.get("https://www.example.com") -##get elements from parent element using TAG_NAME - - # Get element with tag name 'div' -element = driver.find_element(By.TAG_NAME, 'div') - - # Get all the elements available with tag name 'p' -elements = element.find_elements(By.TAG_NAME, 'p') -for e in elements: - print(e.text) - -##get elements from parent element using XPATH -##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path - - # Get first element of tag 'ul' -element = driver.find_element(By.XPATH, '//ul') - - # get children of tag 'ul' with tag 'li' -elements = driver.find_elements(By.XPATH, './/li') -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -465,17 +426,8 @@ It is used to track (or) find DOM element which has the focus in the current bro } } {{< /tab >}} - {{< tab header="Python" >}} - from selenium import webdriver - from selenium.webdriver.common.by import By - - driver = webdriver.Chrome() - driver.get("https://www.google.com") - driver.find_element(By.CSS_SELECTOR, '[name="q"]').send_keys("webElement") - - # Get attribute of current active element - attr = driver.switch_to.active_element.get_attribute("title") - print(attr) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L85-L88" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 a5c2f0ceaa35..cb02f98245ac 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.ja.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.ja.md @@ -43,8 +43,8 @@ Seleniumは、要素を一意に識別するための多数の組み込み[ロ {{< tab header="Java" >}} WebElement vegetable = driver.findElement(By.className("tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -vegetable = driver.find_element(By.CLASS_NAME, "tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9">}} {{< /tab >}} {{< tab header="CSharp" >}} var vegetable = driver.FindElement(By.ClassName("tomatoes")); @@ -73,9 +73,8 @@ DOM全体で一意のロケーターを見つけるのではなく、検索を WebElement fruits = driver.findElement(By.id("fruits")); WebElement fruit = fruits.findElement(By.className("tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -fruits = driver.find_element(By.ID, "fruits") -fruit = fruits.find_element(By.CLASS_NAME,"tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9-L10">}} {{< /tab >}} {{< tab header="CSharp" >}} IWebElement fruits = driver.FindElement(By.Id("fruits")); @@ -114,10 +113,8 @@ WebElement shadowHost = driver.findElement(By.cssSelector("#shadow_host")); SearchContext shadowRoot = shadowHost.getShadowRoot(); WebElement shadowContent = shadowRoot.findElement(By.cssSelector("#shadow_content")); {{< /tab >}} -{{< tab header="Python" >}} -shadow_host = driver.find_element(By.CSS_SELECTOR, '#shadow_host') -shadow_root = shadow_host.shadow_root -shadow_content = shadow_root.find_element(By.CSS_SELECTOR, '#shadow_content') +{{< tab header="Python" text=true >}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L21-L22">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -150,8 +147,8 @@ shadow_content = shadow_root.find_element(css: '#shadow_content') {{< tab header="Java" >}} WebElement fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -fruit = driver.find_element(By.CSS_SELECTOR,"#fruits .tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L34" >}} {{< /tab >}} {{< tab header="CSharp" >}} var fruit = driver.FindElement(By.CssSelector("#fruits .tomatoes")); @@ -179,8 +176,8 @@ val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) {{< tab header="Java" >}} List plants = driver.findElements(By.tagName("li")); {{< /tab >}} - {{< tab header="Python" >}} -plants = driver.find_elements(By.TAG_NAME, "li") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L44" >}} {{< /tab >}} {{< tab header="CSharp" >}} IReadOnlyList plants = driver.FindElements(By.TagName("li")); @@ -208,20 +205,8 @@ for (WebElement element : elements) { System.out.println("Paragraph text:" + element.getText()); } {{< /tab >}} - {{< tab header="Python" >}} -from selenium import webdriver -from selenium.webdriver.common.by import By - -driver = webdriver.Firefox() - - # Navigate to Url -driver.get("https://www.example.com") - - # Get all the elements available with tag name 'p' -elements = driver.find_elements(By.TAG_NAME, 'p') - -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L54-L61" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -324,32 +309,8 @@ fun main() { } } {{< /tab >}} - {{< tab header="Python" >}} -from selenium import webdriver -from selenium.webdriver.common.by import By - -driver = webdriver.Chrome() -driver.get("https://www.example.com") -##get elements from parent element using TAG_NAME - - # Get element with tag name 'div' -element = driver.find_element(By.TAG_NAME, 'div') - - # Get all the elements available with tag name 'p' -elements = element.find_elements(By.TAG_NAME, 'p') -for e in elements: - print(e.text) - -##get elements from parent element using XPATH -##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path - - # Get first element of tag 'ul' -element = driver.find_element(By.XPATH, '//ul') - - # get children of tag 'ul' with tag 'li' -elements = driver.find_elements(By.XPATH, './/li') -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -450,17 +411,8 @@ namespace FindElementsFromElement { } } {{< /tab >}} - {{< tab header="Python" >}} - from selenium import webdriver - from selenium.webdriver.common.by import By - - driver = webdriver.Chrome() - driver.get("https://www.google.com") - driver.find_element(By.CSS_SELECTOR, '[name="q"]').send_keys("webElement") - - # Get attribute of current active element - attr = driver.switch_to.active_element.get_attribute("title") - print(attr) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L85-L88" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 b0c426ef7770..06b0fcaadeb4 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 @@ -44,8 +44,8 @@ dois elementos que têm um nome de classe de "tomatoes" então este método reto {{< tab header="Java" >}} WebElement vegetable = driver.findElement(By.className("tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -vegetable = driver.find_element(By.CLASS_NAME, "tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9">}} {{< /tab >}} {{< tab header="CSharp" >}} var vegetable = driver.FindElement(By.ClassName("tomatoes")); @@ -75,9 +75,8 @@ ancestral do elemento indesejado, então invoque o find element nesse objeto: WebElement fruits = driver.findElement(By.id("fruits")); WebElement fruit = fruits.findElement(By.className("tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -fruits = driver.find_element(By.ID, "fruits") -fruit = fruits.find_element(By.CLASS_NAME,"tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9-L10">}} {{< /tab >}} {{< tab header="CSharp" >}} IWebElement fruits = driver.FindElement(By.Id("fruits")); @@ -117,10 +116,8 @@ WebElement shadowHost = driver.findElement(By.cssSelector("#shadow_host")); SearchContext shadowRoot = shadowHost.getShadowRoot(); WebElement shadowContent = shadowRoot.findElement(By.cssSelector("#shadow_content")); {{< /tab >}} -{{< tab header="Python" >}} -shadow_host = driver.find_element(By.CSS_SELECTOR, '#shadow_host') -shadow_root = shadow_host.shadow_root -shadow_content = shadow_root.find_element(By.CSS_SELECTOR, '#shadow_content') +{{< tab header="Python" text=true >}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L21-L22">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -154,8 +151,8 @@ Para esse exemplo, utilizaremos o CSS Selector: {{< tab header="Java" >}} WebElement fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -fruit = driver.find_element(By.CSS_SELECTOR,"#fruits .tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L34" >}} {{< /tab >}} {{< tab header="CSharp" >}} var fruit = driver.FindElement(By.CssSelector("#fruits .tomatoes")); @@ -182,8 +179,8 @@ referências a todos os itens da lista de frutas e vegetais serão devolvidas em {{< tab header="Java" >}} List plants = driver.findElements(By.tagName("li")); {{< /tab >}} - {{< tab header="Python" >}} -plants = driver.find_elements(By.TAG_NAME, "li") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L44" >}} {{< /tab >}} {{< tab header="CSharp" >}} IReadOnlyList plants = driver.FindElements(By.TagName("li")); @@ -212,20 +209,8 @@ for (WebElement element : elements) { System.out.println("Paragraph text:" + element.getText()); } {{< /tab >}} - {{< tab header="Python" >}} -from selenium import webdriver -from selenium.webdriver.common.by import By - -driver = webdriver.Firefox() - - # Navegar até a URL -driver.get("https://www.example.com") - - # Obtém todos os elementos disponiveis com o nome da tag 'p' -elements = driver.find_elements(By.TAG_NAME, 'p') - -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L54-L61" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -328,27 +313,8 @@ Para realizar isso, o WebElement pai é encadeado com o 'findElements' para aces } } {{< /tab >}} - {{< tab header="Python" >}} -##get elements from parent element using TAG_NAME - - # Obtém o elemento com o nome da tag 'div' -element = driver.find_element(By.TAG_NAME, 'div') - - # Obtém todos os elementos disponíveis com o nome da tag 'p' -elements = element.find_elements(By.TAG_NAME, 'p') -for e in elements: - print(e.text) - -##get elements from parent element using XPATH -##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path - - # Get first element of tag 'ul' -element = driver.find_element(By.XPATH, '//ul') - - # get children of tag 'ul' with tag 'li' -elements = driver.find_elements(By.XPATH, './/li') -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -449,17 +415,8 @@ Ele é usado para rastrear (ou) encontrar um elemento DOM que tem o foco no cont } } {{< /tab >}} - {{< tab header="Python" >}} - from selenium import webdriver - from selenium.webdriver.common.by import By - - driver = webdriver.Chrome() - driver.get("https://www.google.com") - driver.find_element(By.CSS_SELECTOR, '[name="q"]').send_keys("webElement") - - # Obter atributo do elemento atualmente ativo - attr = driver.switch_to.active_element.get_attribute("title") - print(attr) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L85-L88" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 37094837cf0d..5834ff7cc100 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 @@ -46,8 +46,8 @@ two elements that have a class name of "tomatoes" so this method will return the {{< tab header="Java" >}} WebElement vegetable = driver.findElement(By.className("tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -vegetable = driver.find_element(By.CLASS_NAME, "tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9">}} {{< /tab >}} {{< tab header="CSharp" >}} var vegetable = driver.FindElement(By.ClassName("tomatoes")); @@ -78,9 +78,8 @@ ancestor of the undesired element, then call find element on that object: WebElement fruits = driver.findElement(By.id("fruits")); WebElement fruit = fruits.findElement(By.className("tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -fruits = driver.find_element(By.ID, "fruits") -fruit = fruits.find_element(By.CLASS_NAME,"tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9-L10">}} {{< /tab >}} {{< tab header="CSharp" >}} IWebElement fruits = driver.FindElement(By.Id("fruits")); @@ -120,10 +119,8 @@ WebElement shadowHost = driver.findElement(By.cssSelector("#shadow_host")); SearchContext shadowRoot = shadowHost.getShadowRoot(); WebElement shadowContent = shadowRoot.findElement(By.cssSelector("#shadow_content")); {{< /tab >}} -{{< tab header="Python" >}} -shadow_host = driver.find_element(By.CSS_SELECTOR, '#shadow_host') -shadow_root = shadow_host.shadow_root -shadow_content = shadow_root.find_element(By.CSS_SELECTOR, '#shadow_content') +{{< tab header="Python" text=true >}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L21-L22">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -158,8 +155,8 @@ For this example, we'll use a CSS Selector: {{< tab header="Java" >}} WebElement fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")); {{< /tab >}} - {{< tab header="Python" >}} -fruit = driver.find_element(By.CSS_SELECTOR,"#fruits .tomatoes") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L34" >}} {{< /tab >}} {{< tab header="CSharp" >}} var fruit = driver.FindElement(By.CssSelector("#fruits .tomatoes")); @@ -187,8 +184,8 @@ references to all fruits and vegetable list items will be returned in a collecti {{< tab header="Java" >}} List plants = driver.findElements(By.tagName("li")); {{< /tab >}} - {{< tab header="Python" >}} -plants = driver.find_elements(By.TAG_NAME, "li") + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L44" >}} {{< /tab >}} {{< tab header="CSharp" >}} IReadOnlyList plants = driver.FindElements(By.TagName("li")); @@ -217,20 +214,8 @@ for (WebElement element : elements) { System.out.println("Paragraph text:" + element.getText()); } {{< /tab >}} - {{< tab header="Python" >}} -from selenium import webdriver -from selenium.webdriver.common.by import By - -driver = webdriver.Firefox() - - # Navigate to Url -driver.get("https://www.example.com") - - # Get all the elements available with tag name 'p' -elements = driver.find_elements(By.TAG_NAME, 'p') - -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L54-L61" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -333,32 +318,8 @@ To achieve this, the parent WebElement is chained with 'findElements' to access } } {{< /tab >}} - {{< tab header="Python" >}} -from selenium import webdriver -from selenium.webdriver.common.by import By - -driver = webdriver.Chrome() -driver.get("https://www.example.com") -##get elements from parent element using TAG_NAME - - # Get element with tag name 'div' -element = driver.find_element(By.TAG_NAME, 'div') - - # Get all the elements available with tag name 'p' -elements = element.find_elements(By.TAG_NAME, 'p') -for e in elements: - print(e.text) - -##get elements from parent element using XPATH -##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path - - # Get first element of tag 'ul' -element = driver.find_element(By.XPATH, '//ul') - - # get children of tag 'ul' with tag 'li' -elements = driver.find_elements(By.XPATH, './/li') -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -459,17 +420,8 @@ It is used to track (or) find DOM element which has the focus in the current bro } } {{< /tab >}} - {{< tab header="Python" >}} - from selenium import webdriver - from selenium.webdriver.common.by import By - - driver = webdriver.Chrome() - driver.get("https://www.google.com") - driver.find_element(By.CSS_SELECTOR, '[name="q"]').send_keys("webElement") - - # Get attribute of current active element - attr = driver.switch_to.active_element.get_attribute("title") - print(attr) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L85-L88" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; From 6d36b75128bbe3f8c03a67f7cfbb8ab1b3d0f6a2 Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Mon, 20 Jul 2026 15:28:17 +0200 Subject: [PATCH 3/6] docs: temporarily keep inline Python for find-elements-from-element Match trunk's current inline Python snippet for this one tab exactly so a trunk merge has no conflict here. A follow-up commit restores the gh-codeblock reference once the merge lands. Co-Authored-By: Claude Sonnet 5 --- .../webdriver/elements/finders.en.md | 28 +++++++++++++++++-- .../webdriver/elements/finders.ja.md | 28 +++++++++++++++++-- .../webdriver/elements/finders.pt-br.md | 23 +++++++++++++-- .../webdriver/elements/finders.zh-cn.md | 28 +++++++++++++++++-- 4 files changed, 99 insertions(+), 8 deletions(-) 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 5089e56198b3..01aed3e075c5 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.en.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.en.md @@ -323,8 +323,32 @@ 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#L66-L74" >}} + {{< tab header="Python" >}} +from selenium import webdriver +from selenium.webdriver.common.by import By + +driver = webdriver.Chrome() +driver.get("https://www.example.com") +##get elements from parent element using TAG_NAME + + # Get element with tag name 'div' +element = driver.find_element(By.TAG_NAME, 'div') + + # Get all the elements available with tag name 'p' +elements = element.find_elements(By.TAG_NAME, 'p') +for e in elements: + print(e.text) + +##get elements from parent element using XPATH +##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path + + # Get first element of tag 'ul' +element = driver.find_element(By.XPATH, '//ul') + + # get children of tag 'ul' with tag 'li' +elements = element.find_elements(By.XPATH, './/li') +for e in elements: + print(e.text) {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 cb02f98245ac..e7b5ef4d83e1 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.ja.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.ja.md @@ -309,8 +309,32 @@ fun main() { } } {{< /tab >}} - {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} + {{< tab header="Python" >}} +from selenium import webdriver +from selenium.webdriver.common.by import By + +driver = webdriver.Chrome() +driver.get("https://www.example.com") +##get elements from parent element using TAG_NAME + + # Get element with tag name 'div' +element = driver.find_element(By.TAG_NAME, 'div') + + # Get all the elements available with tag name 'p' +elements = element.find_elements(By.TAG_NAME, 'p') +for e in elements: + print(e.text) + +##get elements from parent element using XPATH +##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path + + # Get first element of tag 'ul' +element = driver.find_element(By.XPATH, '//ul') + + # get children of tag 'ul' with tag 'li' +elements = element.find_elements(By.XPATH, './/li') +for e in elements: + print(e.text) {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 06b0fcaadeb4..52c0b0ec6302 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 @@ -313,8 +313,27 @@ 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#L66-L74" >}} + {{< tab header="Python" >}} +##get elements from parent element using TAG_NAME + + # Obtém o elemento com o nome da tag 'div' +element = driver.find_element(By.TAG_NAME, 'div') + + # Obtém todos os elementos disponíveis com o nome da tag 'p' +elements = element.find_elements(By.TAG_NAME, 'p') +for e in elements: + print(e.text) + +##get elements from parent element using XPATH +##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path + + # Get first element of tag 'ul' +element = driver.find_element(By.XPATH, '//ul') + + # get children of tag 'ul' with tag 'li' +elements = element.find_elements(By.XPATH, './/li') +for e in elements: + print(e.text) {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 5834ff7cc100..c2d965adf20e 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 @@ -318,8 +318,32 @@ 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#L66-L74" >}} + {{< tab header="Python" >}} +from selenium import webdriver +from selenium.webdriver.common.by import By + +driver = webdriver.Chrome() +driver.get("https://www.example.com") +##get elements from parent element using TAG_NAME + + # Get element with tag name 'div' +element = driver.find_element(By.TAG_NAME, 'div') + + # Get all the elements available with tag name 'p' +elements = element.find_elements(By.TAG_NAME, 'p') +for e in elements: + print(e.text) + +##get elements from parent element using XPATH +##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path + + # Get first element of tag 'ul' +element = driver.find_element(By.XPATH, '//ul') + + # get children of tag 'ul' with tag 'li' +elements = element.find_elements(By.XPATH, './/li') +for e in elements: + print(e.text) {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; From c4c51f6435c4e04c8c0238f6db532d6b074aa3c7 Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Mon, 20 Jul 2026 15:36:45 +0200 Subject: [PATCH 4/6] docs: use gh-codeblock for find-elements-from-element Python example Now that the trunk sync landed, restore the Python tab to reference test_finders.py instead of the inline snippet that was kept temporarily to avoid a merge conflict. Co-Authored-By: Claude Sonnet 5 --- .../webdriver/elements/finders.en.md | 28 ++----------------- .../webdriver/elements/finders.ja.md | 28 ++----------------- .../webdriver/elements/finders.pt-br.md | 23 ++------------- .../webdriver/elements/finders.zh-cn.md | 28 ++----------------- 4 files changed, 8 insertions(+), 99 deletions(-) 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 5f74c616b152..4189b434b907 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.en.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.en.md @@ -323,32 +323,8 @@ To achieve this, the parent WebElement is chained with 'findElements' to access } } {{< /tab >}} - {{< tab header="Python" >}} -from selenium import webdriver -from selenium.webdriver.common.by import By - -driver = webdriver.Chrome() -driver.get("https://www.example.com") -##get elements from parent element using TAG_NAME - - # Get element with tag name 'div' -element = driver.find_element(By.TAG_NAME, 'div') - - # Get all the elements available with tag name 'p' -elements = element.find_elements(By.TAG_NAME, 'p') -for e in elements: - print(e.text) - -##get elements from parent element using XPATH -##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path - - # Get first element of tag 'ul' -element = driver.find_element(By.XPATH, '//ul') - - # get children of tag 'ul' with tag 'li' -elements = element.find_elements(By.XPATH, './/li') -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 8981667df56d..6df49e32fc6f 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.ja.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.ja.md @@ -309,32 +309,8 @@ fun main() { } } {{< /tab >}} - {{< tab header="Python" >}} -from selenium import webdriver -from selenium.webdriver.common.by import By - -driver = webdriver.Chrome() -driver.get("https://www.example.com") -##get elements from parent element using TAG_NAME - - # Get element with tag name 'div' -element = driver.find_element(By.TAG_NAME, 'div') - - # Get all the elements available with tag name 'p' -elements = element.find_elements(By.TAG_NAME, 'p') -for e in elements: - print(e.text) - -##get elements from parent element using XPATH -##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path - - # Get first element of tag 'ul' -element = driver.find_element(By.XPATH, '//ul') - - # get children of tag 'ul' with tag 'li' -elements = element.find_elements(By.XPATH, './/li') -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 bb01377c0b1e..02805e682074 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 @@ -313,27 +313,8 @@ Para realizar isso, o WebElement pai é encadeado com o 'findElements' para aces } } {{< /tab >}} - {{< tab header="Python" >}} -##get elements from parent element using TAG_NAME - - # Obtém o elemento com o nome da tag 'div' -element = driver.find_element(By.TAG_NAME, 'div') - - # Obtém todos os elementos disponíveis com o nome da tag 'p' -elements = element.find_elements(By.TAG_NAME, 'p') -for e in elements: - print(e.text) - -##get elements from parent element using XPATH -##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path - - # Get first element of tag 'ul' -element = driver.find_element(By.XPATH, '//ul') - - # get children of tag 'ul' with tag 'li' -elements = element.find_elements(By.XPATH, './/li') -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 cb1868211d68..9c4ccb85efee 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 @@ -319,32 +319,8 @@ fun main() { } } {{< /tab >}} - {{< tab header="Python" >}} -from selenium import webdriver -from selenium.webdriver.common.by import By - -driver = webdriver.Chrome() -driver.get("https://www.example.com") -##get elements from parent element using TAG_NAME - - # Get element with tag name 'div' -element = driver.find_element(By.TAG_NAME, 'div') - - # Get all the elements available with tag name 'p' -elements = element.find_elements(By.TAG_NAME, 'p') -for e in elements: - print(e.text) - -##get elements from parent element using XPATH -##NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path - - # Get first element of tag 'ul' -element = driver.find_element(By.XPATH, '//ul') - - # get children of tag 'ul' with tag 'li' -elements = element.find_elements(By.XPATH, './/li') -for e in elements: - print(e.text) + {{< tab header="Python" text=true >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; From 9ca4b3405f43753915349415904e9e3493fe6c18 Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Mon, 20 Jul 2026 17:43:30 +0200 Subject: [PATCH 5/6] fix: align Python finders examples with other language bindings - Mirror the doc's "tomatoes/fruits" HTML snippet for the illustrative sections (basic finder, subset of DOM, optimized locator, all matching elements), matching Java/C#/JS/Kotlin/Ruby exactly. These are marked pytest.mark.skip since no live fixture page implements that HTML, the same approach already used by finders_spec.rb in Ruby. - Fix a real XPath-scoping bug: find_elements_from_element used an absolute XPath (//ul) from an element, which searches the whole document instead of scoping to it, contradicting its own comment. Replaced with the simple TAG_NAME div/p pattern that Java/C#/JS/Ruby already use for this section. - Replace brittle selectors tied to the live selenium.dev homepage layout (.td-home, #announcement-banner, .nav-item.dropdown) with example.com and the existing web-form.html/shadowRootPage.html fixtures already used elsewhere in these examples. Verified: all 8 tests collect, the 4 runnable ones pass against real Chrome, the 4 illustrative ones report skipped. Co-Authored-By: Claude Sonnet 5 --- .../python/tests/elements/test_finders.py | 111 +++++++++--------- .../webdriver/elements/finders.en.md | 14 +-- .../webdriver/elements/finders.ja.md | 14 +-- .../webdriver/elements/finders.pt-br.md | 14 +-- .../webdriver/elements/finders.zh-cn.md | 14 +-- 5 files changed, 84 insertions(+), 83 deletions(-) diff --git a/examples/python/tests/elements/test_finders.py b/examples/python/tests/elements/test_finders.py index a1d5c186adc7..16f6c4f0127a 100644 --- a/examples/python/tests/elements/test_finders.py +++ b/examples/python/tests/elements/test_finders.py @@ -1,93 +1,94 @@ +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… +#
+#
    +#
  • … +#
  • … +#
  • Tomato is a Fruit… +#
+ + +@pytest.mark.skip(reason="illustrative example, not an executable test") def test_basic_finders(): - driver = webdriver.Chrome() - driver.get('https://www.selenium.dev/') + vegetable = driver.find_element(By.CLASS_NAME, 'tomatoes') - body_on_page = driver.find_element(By.CLASS_NAME, 'td-home') - container_on_page = body_on_page.find_element(By.CLASS_NAME, 'container-fluid') - assert container_on_page.is_displayed() +@pytest.mark.skip(reason="illustrative example, not an executable test") +def test_subset_of_dom(): + fruits = driver.find_element(By.ID, 'fruits') + fruit = fruits.find_element(By.CLASS_NAME, 'tomatoes') - driver.quit() -def test_evaluating_shadow_DOM(): - driver = webdriver.Chrome() - driver.implicitly_wait(5) - driver.get('https://www.selenium.dev/selenium/web/shadowRootPage.html') +@pytest.mark.skip(reason="illustrative example, not an executable test") +def test_optimized_locator(): + fruit = driver.find_element(By.CSS_SELECTOR, '#fruits .tomatoes') - custom_element = driver.find_element(By.TAG_NAME, 'custom-checkbox-element') - shadow_dom_input = custom_element.shadow_root.find_element(By.CSS_SELECTOR, 'input[type=checkbox]') - assert custom_element.is_displayed() - assert custom_element.shadow_root - assert shadow_dom_input.is_displayed() +@pytest.mark.skip(reason="illustrative example, not an executable test") +def test_all_matching_elements(): + plants = driver.find_elements(By.TAG_NAME, 'li') - driver.quit() -def test_optimized_locator(): +def test_evaluating_shadow_dom(): driver = webdriver.Chrome() - driver.get('https://www.selenium.dev/') + driver.implicitly_wait(5) + driver.get('https://www.selenium.dev/selenium/web/shadowRootPage.html') - nested_element = driver.find_element(By.CSS_SELECTOR, '.td-home #announcement-banner') + shadow_host = driver.find_element(By.TAG_NAME, 'custom-checkbox-element') + shadow_root = shadow_host.shadow_root + shadow_content = shadow_root.find_element(By.CSS_SELECTOR, 'input[type=checkbox]') - assert nested_element.is_displayed() + assert shadow_host.is_displayed() + assert shadow_root + assert shadow_content.is_displayed() driver.quit() -def test_all_matching_elements(): + +def test_get_element(): driver = webdriver.Chrome() - driver.get('https://www.selenium.dev/') + driver.get('https://www.example.com') - header_two_elements = driver.find_elements(By.TAG_NAME, 'h2') - - assert len(header_two_elements) > 1 + elements = driver.find_elements(By.TAG_NAME, 'p') + for element in elements: + print(element.text) - for header_element in header_two_elements: - print(header_element.text) + assert len(elements) > 0 driver.quit() + def test_find_elements_from_element(): driver = webdriver.Chrome() - driver.get('https://www.selenium.dev/') - - main_element = driver.find_element(By.TAG_NAME, 'main') - svg_elements = main_element.find_elements(By.TAG_NAME, 'svg') - - for svg_element in svg_elements: - print(svg_element.is_displayed()) - - ## get elements from parent element using XPATH - ## NOTE: in order to utilize XPATH from current element, you must add "." to beginning of path + driver.get('https://www.example.com') - header_tag = driver.find_element(By.TAG_NAME, 'header') - # Get first element of tag 'ul' - ul_tag = header_tag.find_element(By.XPATH, '//ul') + element = driver.find_element(By.TAG_NAME, 'div') + elements = element.find_elements(By.TAG_NAME, 'p') + for e in elements: + print(e.text) - # get children of tag 'ul' with tag 'li' - elements = ul_tag.find_elements(By.XPATH, './/li') - - for element in elements: - print(element.text) - assert len(elements) > 0 - assert len(svg_elements) > 1 driver.quit() + def test_get_active_element(): driver = webdriver.Chrome() - driver.get('https://www.selenium.dev/') - - dropdown = driver.find_element(By.CSS_SELECTOR, '.nav-item.dropdown') - dropdown.click() + driver.get('https://www.selenium.dev/selenium/web/web-form.html') - active_element = driver.switch_to.active_element + driver.find_element(By.CSS_SELECTOR, '[name="my-text"]').send_keys('webElement') + attr = driver.switch_to.active_element.get_attribute('name') - assert active_element.get_attribute('href').endswith('#') + assert attr == 'my-text' driver.quit() - 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 4189b434b907..c46fe8873d20 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.en.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.en.md @@ -47,7 +47,7 @@ two elements that have a class name of "tomatoes" so this method will return the WebElement vegetable = driver.findElement(By.className("tomatoes")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L23">}} {{< /tab >}} {{< tab header="CSharp" >}} var vegetable = driver.FindElement(By.ClassName("tomatoes")); @@ -80,7 +80,7 @@ WebElement fruits = driver.findElement(By.id("fruits")); WebElement fruit = fruits.findElement(By.className("tomatoes")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9-L10">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L28-L29">}} {{< /tab >}} {{< tab header="CSharp" >}} IWebElement fruits = driver.FindElement(By.Id("fruits")); @@ -121,7 +121,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#L21-L22">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L49">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -188,7 +188,7 @@ references to all fruits and vegetable list items will be returned in a collecti List plants = driver.findElements(By.tagName("li")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L44" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39" >}} {{< /tab >}} {{< tab header="CSharp" >}} IReadOnlyList plants = driver.FindElements(By.TagName("li")); @@ -219,7 +219,7 @@ for (WebElement element : elements) { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L54-L61" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L62-L64" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -324,7 +324,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#L66-L74" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L75-L78" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -427,7 +427,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#L85-L88" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L89-L90" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 6df49e32fc6f..959c93fa86a9 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.ja.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.ja.md @@ -44,7 +44,7 @@ Seleniumは、要素を一意に識別するための多数の組み込み[ロ WebElement vegetable = driver.findElement(By.className("tomatoes")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L23">}} {{< /tab >}} {{< tab header="CSharp" >}} var vegetable = driver.FindElement(By.ClassName("tomatoes")); @@ -74,7 +74,7 @@ WebElement fruits = driver.findElement(By.id("fruits")); WebElement fruit = fruits.findElement(By.className("tomatoes")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9-L10">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L28-L29">}} {{< /tab >}} {{< tab header="CSharp" >}} IWebElement fruits = driver.FindElement(By.Id("fruits")); @@ -114,7 +114,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#L21-L22">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L49">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -177,7 +177,7 @@ val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) List plants = driver.findElements(By.tagName("li")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L44" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39" >}} {{< /tab >}} {{< tab header="CSharp" >}} IReadOnlyList plants = driver.FindElements(By.TagName("li")); @@ -206,7 +206,7 @@ for (WebElement element : elements) { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L54-L61" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L62-L64" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -310,7 +310,7 @@ fun main() { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L75-L78" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -412,7 +412,7 @@ namespace FindElementsFromElement { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L85-L88" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L89-L90" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 02805e682074..78785e8c37f8 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 @@ -45,7 +45,7 @@ dois elementos que têm um nome de classe de "tomatoes" então este método reto WebElement vegetable = driver.findElement(By.className("tomatoes")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L23">}} {{< /tab >}} {{< tab header="CSharp" >}} var vegetable = driver.FindElement(By.ClassName("tomatoes")); @@ -76,7 +76,7 @@ WebElement fruits = driver.findElement(By.id("fruits")); WebElement fruit = fruits.findElement(By.className("tomatoes")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9-L10">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L28-L29">}} {{< /tab >}} {{< tab header="CSharp" >}} IWebElement fruits = driver.FindElement(By.Id("fruits")); @@ -117,7 +117,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#L21-L22">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L49">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -180,7 +180,7 @@ referências a todos os itens da lista de frutas e vegetais serão devolvidas em List plants = driver.findElements(By.tagName("li")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L44" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39" >}} {{< /tab >}} {{< tab header="CSharp" >}} IReadOnlyList plants = driver.FindElements(By.TagName("li")); @@ -210,7 +210,7 @@ for (WebElement element : elements) { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L54-L61" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L62-L64" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -314,7 +314,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#L66-L74" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L75-L78" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -416,7 +416,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#L85-L88" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L89-L90" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; 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 9c4ccb85efee..9a735e7bdfe0 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 @@ -47,7 +47,7 @@ Selenium 提供了许多内置的 [定位策略]({{< ref "locators.md" >}}), WebElement vegetable = driver.findElement(By.className("tomatoes")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L23">}} {{< /tab >}} {{< tab header="CSharp" >}} var vegetable = driver.FindElement(By.ClassName("tomatoes")); @@ -82,7 +82,7 @@ WebElement fruits = driver.findElement(By.id("fruits")); WebElement fruit = fruits.findElement(By.className("tomatoes")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L9-L10">}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L28-L29">}} {{< /tab >}} {{< tab header="CSharp" >}} IWebElement fruits = driver.FindElement(By.Id("fruits")); @@ -121,7 +121,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#L21-L22">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L49">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); @@ -186,7 +186,7 @@ val fruit = driver.findElement(By.cssSelector("#fruits .tomatoes")) List plants = driver.findElements(By.tagName("li")); {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L44" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L39" >}} {{< /tab >}} {{< tab header="CSharp" >}} IReadOnlyList plants = driver.FindElements(By.TagName("li")); @@ -216,7 +216,7 @@ for (WebElement element : elements) { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L54-L61" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L62-L64" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -320,7 +320,7 @@ fun main() { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L66-L74" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L75-L78" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; @@ -422,7 +422,7 @@ namespace FindElementsFromElement { } {{< /tab >}} {{< tab header="Python" text=true >}} - {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L85-L88" >}} + {{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L89-L90" >}} {{< /tab >}} {{< tab header="CSharp" >}} using OpenQA.Selenium; From 6eb6f9ffc2ce0aeb2d40c95f2f5883229162fcfc Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Mon, 20 Jul 2026 18:03:11 +0200 Subject: [PATCH 6/6] fix: address Qodo review feedback on Python finders examples - Accept the driver fixture parameter in the skipped illustrative tests instead of referencing an undefined name, so the snippets aren't one edit away from a NameError if someone unskips them. - Check test_evaluating_shadow_dom's shadow_root truthiness before using it to look up shadow_content, instead of after, so a missing shadow root fails at the assertion instead of an AttributeError deeper in. Co-Authored-By: Claude Sonnet 5 --- examples/python/tests/elements/test_finders.py | 10 +++++----- .../documentation/webdriver/elements/finders.en.md | 2 +- .../documentation/webdriver/elements/finders.ja.md | 2 +- .../documentation/webdriver/elements/finders.pt-br.md | 2 +- .../documentation/webdriver/elements/finders.zh-cn.md | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/python/tests/elements/test_finders.py b/examples/python/tests/elements/test_finders.py index 16f6c4f0127a..11e1eea98ceb 100644 --- a/examples/python/tests/elements/test_finders.py +++ b/examples/python/tests/elements/test_finders.py @@ -19,23 +19,23 @@ @pytest.mark.skip(reason="illustrative example, not an executable test") -def test_basic_finders(): +def test_basic_finders(driver): vegetable = driver.find_element(By.CLASS_NAME, 'tomatoes') @pytest.mark.skip(reason="illustrative example, not an executable test") -def test_subset_of_dom(): +def test_subset_of_dom(driver): fruits = driver.find_element(By.ID, 'fruits') fruit = fruits.find_element(By.CLASS_NAME, 'tomatoes') @pytest.mark.skip(reason="illustrative example, not an executable test") -def test_optimized_locator(): +def test_optimized_locator(driver): fruit = driver.find_element(By.CSS_SELECTOR, '#fruits .tomatoes') @pytest.mark.skip(reason="illustrative example, not an executable test") -def test_all_matching_elements(): +def test_all_matching_elements(driver): plants = driver.find_elements(By.TAG_NAME, 'li') @@ -46,10 +46,10 @@ def test_evaluating_shadow_dom(): shadow_host = driver.find_element(By.TAG_NAME, 'custom-checkbox-element') shadow_root = shadow_host.shadow_root + assert shadow_root shadow_content = shadow_root.find_element(By.CSS_SELECTOR, 'input[type=checkbox]') assert shadow_host.is_displayed() - assert shadow_root assert shadow_content.is_displayed() driver.quit() 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 c46fe8873d20..0bf1c9b031ec 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.en.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.en.md @@ -121,7 +121,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-L49">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L50">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); 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 959c93fa86a9..933571f9d0ea 100644 --- a/website_and_docs/content/documentation/webdriver/elements/finders.ja.md +++ b/website_and_docs/content/documentation/webdriver/elements/finders.ja.md @@ -114,7 +114,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-L49">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L50">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); 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 78785e8c37f8..a2daa5354965 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 @@ -117,7 +117,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-L49">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L50">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host")); 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 9a735e7bdfe0..1633e2742cf3 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 @@ -121,7 +121,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-L49">}} +{{< gh-codeblock path="/examples/python/tests/elements/test_finders.py#L47-L50">}} {{< /tab >}} {{< tab header="CSharp" >}} var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host"));