Software">
Nothing Special   »   [go: up one dir, main page]

Curso Python Selenium

Fazer download em odt, pdf ou txt
Fazer download em odt, pdf ou txt
Você está na página 1de 25

from selenium import webdriver

driver = webdriver.Firefox()

driver.get('http://www.google.com')

element = driver.find_element_by_tag_name('input[name=\'btnI\']')

print(element.get_attribute('value'))

driver.quit()
Debug no Pycharm, elemento (Q) Firefox
Debugando no Pycharm, abrindo página no Firefox, inspecionando elemento (Q), e encontrando
código referente ao elemento.
Localizando elemento pela Opção: find_element_by_tag_name

find_element_by_tag_name
from selenium import webdriver

driver = webdriver.Firefox()

driver.get('http://www.google.com')

element = driver.find_element_by_tag_name( 'input[name=\'btnI\']')


print(element.get_attribute('value'))

driver.quit()
Usando o XPath
Identificadores utilizados no XPath

Exemplo de uso do XPath


http://www.portaltransparencia.gov.br/localidades/3125101-extrema

Chrome:
XPath
//*[@id="collapse-barras-horizontal-1"]/div/table/tbody/tr[1]/td[2]
full Xpath
/html/body/main/div[6]/div/div[2]/div[2]/div/div[2]/div/div/table/tbody/tr[1]/td[2]
SelectorsHub_CopyRelativeXPath(selectorshub.com)
//td[normalize-space()='R$ 25.986.600,00']

Firefox:
Xpath
/html/body/main/div[6]/div/div[2]/div[2]/div/div[2]/div/div/table/tbody/tr[1]/td[2]
SelectorsHub_CopyRelativeXPath(selectorshub.com)
//td[normalize-space()='R$ 25.986.600,00']
Exemplo do XPath, dentro do HTML:
CSS Selector
Aprenda por definitivo a usar CSS Selector(Adeus Xpath).
Ref.:
<https://medium.com/automa%C3%A7%C3%A3o-com-batista/aprenda-por-definitivo-a-usar-css-
selector-adeus-xpath-1f3956763c2>

Pra quem começa na área de testes automatizados a primeira coisa que


aprende, é buscar elementos por Xpath pelo fato de existir umas
ferramentas que auxiliam na busca de elementos.

Mas buscar elementos por Xpath é a pior escolha possível além de ficar
horroroso o código e diminuir a legibilidade ,tem difícil refatoração e ainda
deixa mais lento.Se e desenvolvedor colocar uma div a mais na tela acabou,
vai quebrar em vários lugares do seu projeto. Então podemos resolver isso
de uma maneira muito mais fácil e rápido. Com Css Selector.

Primeiro temos que saber o que é um elemento:

Com essa imagem podemos ver que uma tag, um atributo, um valor e um
conteúdo, tudo isso forma um elemento.
Então para nossa alegria existem várias possibilidades de se buscar por Css Selector!
Vamos para nossa lista!
Irei colocar os mais usados para fazer as automações o resto você pode procurar na página:

https://www.w3schools.com/cssref/css_selectors.asp
Usando: css_selector e xpath

from selenium import webdriver


driver = webdriver.Firefox()
driver.get('http://localhost:8083/html/page_css_selector.html')
#-----------------------------------------------------------------------------

1. Seleção por classe(.class)


print(driver.find_element_by_css_selector(".classcenter").text)
#out-> This paragraph refers

# Utilizando XPath
print(driver.find_element_by_xpath("//p[@class='classcenter']").text)
#out-> This paragraph refers
#-----------------------------------------------------------------------------

2. Seleção por id(#identificador)


print(driver.find_element_by_css_selector("#idcenter").text)
#out-> This paragraph refers

# Utilizando XPath
print(driver.find_element_by_xpath("//p[@id='idcenter']").text)
#out-> This paragraph refers
#-----------------------------------------------------------------------------

3.1. Seleção por elementos encadeados


print(driver.find_element_by_css_selector("div>div>span").text)
#out-> Duck

# Utilizando XPath
print(driver.find_element_by_xpath("//div/div/span").text)
#out-> Duck
#-----------------------------------------------------------------------------
3.2. Seleção por elementos
print(driver.find_element_by_css_selector("div>span").text)
#out-> Duck

# Utilizando XPath
print(driver.find_element_by_xpath("//div/span").text)
#out-> Duck

#-----------------------------------------------------------------------------

4.1 Seleciona tags com um determinado id


print(driver.find_element_by_css_selector("p[id='my-address']").text)
#out-> I live in Duckburg

# Utilizando XPath
print(driver.find_element_by_xpath("//p[@id='my-address']").text)
#out-> I live in Duckburg

#-----------------------------------------------------------------------------

4.2 Seleciona tags que a patir de uma determinada substring


print(driver.find_element_by_css_selector("p[id*='address']").text)
#out-> I live in Duckburg

#-----------------------------------------------------------------------------

4.3 Seleciona tags que a patir de uma determinada substring


print(driver.find_element_by_css_selector("p[id|='my']").text)
#out-> I live in Duckburg

#-----------------------------------------------------------------------------

4.4 Seleciona tags que a patir de uma determinada substring inicial


print(driver.find_element_by_css_selector("a[href^='https']").text)
#out-> I live in Duckburg
# -----------------------------------------------------------------------------

4.5 Seleciona tags que a patir de uma determinada substring no final

elem = driver.find_elements_by_css_selector("a[href$='.pdf']")
for i in elem:
print(i.text)
#out-> Python
#out-> Python Selenium
print(elem[0].text)
print(elem[1].text)
#out-> Python
#out-> Python Selenium

#-----------------------------------------------------------------------------

4.6 Selelecina tags em relação ao valor uma substring de um atributo


print(driver.find_element_by_css_selector("a[href*='w3schools']").text)
#out-> THE WORLD'S LARGEST WEB DEVELOPER SITE

#-----------------------------------------------------------------------------

5. Seleciona primeiro elemento filho de uma tag


print(driver.find_element_by_css_selector("div>p:first-child").text)
#out-> My name is Donald Duck

# Utilizando XPath
print(driver.find_element_by_xpath("//div[@class='intro']/p[1]").text)
#out-> My name is Donald Duck

#-----------------------------------------------------------------------------
6. Seleciona elemento filho, a partir de contagem crescente: inicia em 1
print(driver.find_element_by_css_selector("div>p:nth-child(3)").text)
#out-> I use selenium framework for RPA

# Utilizando XPath
print(driver.find_element_by_xpath("//div[@class='intro']/p[3]").text)
#out-> I use selenium framework for RPA
#-----------------------------------------------------------------------------

7. Seleciona primeiro elemento filho


print(driver.find_element_by_css_selector("ul>li:first-of-type").text)
#out-> Goofy

# Utilizando XPath
print(driver.find_element_by_xpath("//div[@class='intro']/ul[@id='Listfriends']/li[1]").text)
#out-> Goofy

#-----------------------------------------------------------------------------

8. Captura uma lista, para seleção de um elemento


print(driver.find_elements_by_css_selector("#Listfriends>li")[1].text)
#out->

# Utilizando XPath
print(driver.find_element_by_xpath("//ul[@id='Listfriends']/li[2]").text)
#out->
#-----------------------------------------------------------------------------

9. Seleciona o ultimo elemento filho


print(driver.find_element_by_css_selector("ul>li:last-of-type").text)
#out-> Pluto

# Utilizando XPath
print(driver.find_element_by_xpath("//ul[@id='Listfriends']/li[4]").text)
#out-> Pluto
#-----------------------------------------------------------------------------
10. Seleciona elementos desativados (disabled)
print(driver.find_element_by_css_selector("form>input:disabled").get_attribute('value'))
#out-> undefined
#-----------------------------------------------------------------------------

11. Seleciona por elemento verificado (checked)


elemAge = driver.find_element_by_css_selector("form>input:checked").get_attribute('id')
print(driver.find_element_by_css_selector("label[for='" + elemAge + "']").text)
#out-> 31 - 60
#-----------------------------------------------------------------------------

#print(driver.current_url)

driver.quit()
Tabela css_selector e XPath
1. Métodos para localizar elementos:
Existem várias estratégias para localizar elementos em uma página, um deles é usando o BY, ou
usar os métodos de forma direta somente preenchendo o conteúdo do atributo. Você pode usar o
mais apropriado para o seu caso. O Selenium fornece os seguintes métodos para localizar elementos
em uma página, listamos todos abaixo:

**
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
**

Para encontrar vários elementos (esses métodos retornarão uma lista/array):


** find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
**

Além dos métodos públicos fornecidos acima, existem dois métodos privados que podem ser úteis
com localizadores em objetos de página. Estes são os dois métodos particulares
(private): find_element e find_elements.

Example de uso:

# -*- coding: utf-8 -*-


from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.google.com.br")
driver.maximize_window()
driver.set_page_load_timeout(30)
driver.implicitly_wait(15)

# interage somente com um elemento


driver.find_element(By.CSS_SELECTOR, 'input[title="Pesquisar"]').send_keys("Selenium")
driver.find_element(By.XPATH, '//input[@value="Pesquisa Google"]').click()

# exemplo de interação com varios elementos.


elementos01 = driver.find_elements(By.CSS_SELECTOR, 'input')
elementos02 = driver.find_elements(By.XPATH, '//button')

# conta a quantidade de elementos de input e button.


print( "{} - {}".format(len(elementos01), len(elementos02)))

driver.quit()
Abaixo temos os atributos da classe By:

ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
Ao invés de localizar os elementos via By, podemos fazer isso diretamente, exemplo:

# -*- coding: utf-8 -*-


from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.google.com.br")
driver.maximize_window()
driver.set_page_load_timeout(30)
driver.implicitly_wait(15)

# interage somente com um elemento


driver.find_element_by_css_selector('input[title="Pesquisar"]').send_keys("Selenium")
driver.find_element_by_xpath('//input[@value="Pesquisa Google"]').click()

# exemplo de interacao com varios elementos.


elementos01 = driver.find_elements_by_css_selector('input')
elementos02 = driver.find_elements_by_xpath('//button')

# conta a quantidade de elementos de input e button.


print( "{} - {}".format(len(elementos01), len(elementos02)))

driver.quit()

1. Localizando elementos por Id (é sempre a melhor opção de


localização)
Deve usar quando tiver o atributo id no elemento esperado. Com essa estratégia, o primeiro
elemento com o atributo id correspondente é retornado. Se nenhum dos elementos da pagina não
tiver nenhum atributo id correspondente, vai retornar um erro NoSuchElementException o erro
será gerado nos logs de execução.
Example de uso:

# https://www.w3schools.com/howto/tryit.asp?filename=tryhow_css_login_form
# -*- coding: utf-8 -*-

from selenium import webdriver


from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.w3schools.com/code/tryit.asp?filename=G0R1H2HWBRSG")
driver.maximize_window()
driver.set_page_load_timeout(30)
driver.implicitly_wait(15)

# interage somente com um elemento


driver.find_element_by_xpath('//button[contains(text(),"Run")]').click() # Nao tem ID, usamos o texto
driver.switch_to.frame("iframeResult") # mudando para o frame que desejamos
# localizando o elemento por ID, nesse caso somente insiro o valor.
driver.find_element_by_id('uname').send_keys('Reinaldo')

# exemplo de interacao com varios elementos.


elementos01 = driver.find_elements_by_id('psw')
elementos01[0].send_keys('12345')
driver.find_elements_by_id('login')[0].send_keys(Keys.ENTER)

# verifica se nosso teste esta correto.


assert driver.title, "W3Schools Online Web Tutorials"

driver.quit()

2. Localizando elemento por Name


Deve usar quando tiver o atributo name no elemento esperado. Com essa estratégia, o primeiro
elemento com um atributo name correspondente será retornado. Se nenhum elemento tiver um
atributo name correspondente, será gerado um NoSuchElementException. Segue o exemplo
abaixo:

Example de uso:

# https://www.w3schools.com/howto/tryit.asp?filename=tryhow_css_login_form
# -*- coding: utf-8 -*-

from selenium import webdriver


from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.w3schools.com/code/tryit.asp?filename=G0R1H2HWBRSG")
driver.maximize_window()
driver.set_page_load_timeout(30)
driver.implicitly_wait(15)

# interage somente com um elemento.


driver.find_element_by_xpath('//button[contains(text(),"Run")]').click() # Nao tem ID, usamos o texto
driver.switch_to.frame("iframeResult") # mudando para o frame que desejamos
# localizando o elemento pelo atributo name
driver.find_element_by_name('uname').send_keys('Reinaldo')

# exemplo de interacao com varios elementos.


elementos01 = driver.find_elements_by_name('psw')
elementos01[0].send_keys('12345')
driver.find_elements_by_name('login')[0].send_keys(Keys.ENTER)

# verifica se nosso teste esta correto.


assert driver.title, "W3Schools Online Web Tutorials"

driver.quit()

3. Localizando elemento por CSS Selectors


Use quando o elemento não tiver ID, usando a sintaxe do seletor CSS. Com essa estratégia, o
primeiro elemento correspondente ao seletor CSS especificado será retornado. Se nenhum elemento
corresponder ao seletor CSS fornecido, um NoSuchElementException será gerado.

Example de uso:

# https://www.w3schools.com/howto/tryit.asp?filename=tryhow_css_login_form
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.w3schools.com/code/tryit.asp?filename=G0R1H2HWBRSG")
driver.maximize_window()
driver.set_page_load_timeout(30)
driver.implicitly_wait(15)

# interage somente com um elemento.


driver.find_element_by_css_selector('button[onclick*="try_it_leaderboard"]').click()
driver.switch_to.frame("iframeResult") # mudando para o frame que desejamos
# localizando o elemento pelo atributo id, o # representa o id no css.
driver.find_element_by_css_selector('#uname').send_keys('Reinaldo')

# exemplo de interacao com varios elementos.


elementos01 = driver.find_elements_by_css_selector('#psw')
elementos01[0].send_keys('12345')
# forma reduzida, o [0] significa o primeiro elemento do meu array.
driver.find_elements_by_css_selector('#login')[0].send_keys(Keys.ENTER)

# verifica se nosso teste esta correto.


assert driver.title, "W3Schools Online Web Tutorials"

driver.quit()

Sauce Labs tem uma boa documentação do mesmo:

4. Localizando elemento por by XPath


XPath é a linguagem usada para localizar nós em um documento XML. Como o HTML pode ser
uma implementação de XML (XHTML), os usuários do Selenium podem aproveitar essa linguagem
poderosa para direcionar elementos em seus aplicativos da web. O XPath suporta os métodos
simples de localização por atributos de identificação ou nome e os estende, abrindo todos os tipos
de novas possibilidades, como localizar a terceira caixa de seleção na página.

Um dos principais motivos para usar o XPath, é quando você não possui um atributo id ou nome
adequado para o elemento que deseja localizar, nesse caso você pode usar AND ou OR lógico
combinando vários atributos que ajuda bastante, resumindo ele tem um leque de combinações mais
que o CSS, mas a comunidade recomenda mais CSS.
Você pode usar o XPath para localizar o elemento em termos absolutos (não recomendado) ou seja
com o caminho dele todo. Paths absolutos contêm a localização de todos os elementos da raiz
(html) e, como resultado, provavelmente falharão com apenas o menor ajuste no aplicativo. Ao
localizar um elemento próximo com um atributo de ID ou nome (idealmente, um elemento pai),
você pode localizar seu elemento de destino com base no relacionamento. É muito menos provável
que isso mude e pode tornar seus testes mais robustos.

Example de uso:

# https://www.w3schools.com/howto/tryit.asp?filename=tryhow_css_login_form
# -*- coding: utf-8 -*-

from selenium import webdriver


from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.w3schools.com/code/tryit.asp?filename=GBIE8VKXQWNG")
driver.maximize_window()
driver.set_page_load_timeout(30)
driver.implicitly_wait(15)

# interage somente com um elemento


# geralmente se usa muito xpath para localizar o texto, esse foi o caso abaixo por não ter id.
# nesse caso vou usar o exato texto, no próximo vou usar o relativo.
driver.find_element_by_xpath('//button[text()="Run »"]').click()
driver.switch_to.frame("iframeResult") # mudando para o frame que desejamos
# nesse caso vou usar o contains, que procura o elemento que contain a palavra Motion dentro do texto.
sistema_name = driver.find_element_by_xpath('//b[contains(text(),"Motion")]').text
assert "Motion" in sistema_name

# localizando o elemento por XPATH


driver.find_element_by_xpath('//input[@id="uname"]').send_keys('Reinaldo')

# exemplo de intercao com varios elemento


elementos01 = driver.find_elements_by_xpath('//input[@id="psw"]')
elementos01[0].send_keys('12345')
# forma reduzida, o [0] significa o primeiro elemento do meu array.
driver.find_elements_by_xpath('//button[@id="login"]')[0].send_keys(Keys.ENTER)

# verifica se nosso teste esta correto.


assert driver.title, "W3Schools Online Web Tutorials"

driver.quit()

Exemplo teórico page source:

<html>
<body>
<form id="loginForm">
<div class='a classe eh dinamica'>Sistema: Motion</div>
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
O elementos HTML acima podem ser localizados da forma abaixo.

login_form = driver.find_element_by_xpath("/html/body/form[1]") #1
login_form = driver.find_element_by_xpath("//form[1]") #2
login_form = driver.find_element_by_xpath("//form[@id='loginForm']") #3

1.Caminho absoluto (seria interrompido se o HTML fosse alterado apenas um pouco).

2.Primeiro elemento do formulário no HTML.

3.O elemento do formulário com o atributo id definido como loginForm (Melhor forma de


aplicar).
O elemento username do usuário pode ser localizado assim:

username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")
1.Criei um exemplo para localizar o nome do meu formulário, que nesse caso chamo de
Motion.
** Uma coisa que tem que ter em mente, o text no xpath, ele não é um atributo (@) e sim
um método, por isso o mesmo usa text() ao invés de @text.

sistema_name = driver.find_element_by_xpath("//b[contains(text(),"Motion")]").text

2.Primeiro elemento do formulário com um elemento filho de entrada com 'name' definido
como 'username'

3.Primeiro elemento filho de entrada do elemento de formulário com o atributo 'id' definido
como 'loginForm'

4.Primeiro elemento de entrada com o atributo name definido como username


O elemento do botão "Limpar" pode ser localizado da forma abaixo:

clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")

1.Uma forma legal é definir vários atributos, name definido como continue e o


atributo type definido como button.
2.Quarto elemento filho de entrada do elemento do formulário com o atributo id definido
como loginForm.
Esses exemplos abrangem alguns princípios básicos, mas para saber mais, as seguintes referências
são recomendadas:

•W3Schools XPath Tutorial

•W3C XPath Recommendation

•XPath Tutorial

5. Localizando Hyperlinks pelo Texto do Link


Geralmente esse opção é usada quando nenhuma das acimas é possível, você pode localizar pelo
nome do link, no exemplo abaixo é feito pelo Continue e Cancel. Com essa estratégia, o primeiro
elemento com o texto do link correspondente ao valor fornecido será retornado. Se nenhum
elemento tiver um atributo de texto de link correspondente, será gerado um
NoSuchElementException.

Exemplo teórico page source:

<html>
<body>
<p>Are you sure you want to do this?</p>
<a href="continue.html">Continue</a>
<a href="cancel.html">Cancel</a>
</body>
<html>

O link continue.html pode ser localizado dessa forma::

continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')
6. Localizando o elemento pela Tag Name
Use quando desejar localizar um elemento pelo nome da tag. Com essa estratégia, o primeiro
elemento com o nome de tag especificado será retornado. Se nenhum elemento tiver um nome de
tag correspondente, um NoSuchElementException será gerado.

Exemplo teórico page source:

<html>
<body>
<h1>Welcome</h1>
<p>Site content goes here.</p>
</body>
<html>

A tag h1 pode ser localizado via tag name, como mostra abaixo:

heading1 = driver.find_element_by_tag_name('h1')

7. Locating Elements by Class Name


Use quando desejar localizar um elemento pelo nome da classe. Com essa estratégia, o primeiro
elemento com o atributo de nome de classe correspondente será retornado. Se nenhum elemento
tiver um atributo de nome de classe correspondente, um NoSuchElementException será gerado.
For instance, consider this page source::

<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>

O elemento "p" pode ser localizado via class name, como mostra abaixo:

content = driver.find_element_by_class_name('content')

Sites de Treinamento (Treine nos sites abaixo):


http://automationpractice.com/index.php
http://webdriveruniversity.com/index.html
https://www.phptravels.net/index.php
http://the-internet.herokuapp.com/
http://newtours.demoaut.com/
https://demoqa.com/
https://ultimateqa.com/automation/
https://www.saucedemo.com/
https://automacaocombatista.herokuapp.com/
Referências (Este tópico foi somente traduzido para o português, os sites oficias se encontram
abaixo):
https://selenium.dev/documentation/en/getting_started/
https://selenium-python.readthedocs.io/locating-elements.html

Você também pode gostar