Curso Python Selenium
Curso Python Selenium
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')
driver.quit()
Usando o XPath
Identificadores utilizados no XPath
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>
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.
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
# Utilizando XPath
print(driver.find_element_by_xpath("//p[@class='classcenter']").text)
#out-> This paragraph refers
#-----------------------------------------------------------------------------
# Utilizando XPath
print(driver.find_element_by_xpath("//p[@id='idcenter']").text)
#out-> This paragraph refers
#-----------------------------------------------------------------------------
# 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
#-----------------------------------------------------------------------------
# Utilizando XPath
print(driver.find_element_by_xpath("//p[@id='my-address']").text)
#out-> I live in Duckburg
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
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
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# 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
#-----------------------------------------------------------------------------
# Utilizando XPath
print(driver.find_element_by_xpath("//div[@class='intro']/ul[@id='Listfriends']/li[1]").text)
#out-> Goofy
#-----------------------------------------------------------------------------
# Utilizando XPath
print(driver.find_element_by_xpath("//ul[@id='Listfriends']/li[2]").text)
#out->
#-----------------------------------------------------------------------------
# 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
#-----------------------------------------------------------------------------
#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
**
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:
driver = webdriver.Chrome()
driver.get("https://www.google.com.br")
driver.maximize_window()
driver.set_page_load_timeout(30)
driver.implicitly_wait(15)
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:
driver = webdriver.Chrome()
driver.get("https://www.google.com.br")
driver.maximize_window()
driver.set_page_load_timeout(30)
driver.implicitly_wait(15)
driver.quit()
# https://www.w3schools.com/howto/tryit.asp?filename=tryhow_css_login_form
# -*- coding: utf-8 -*-
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)
driver.quit()
Example de uso:
# https://www.w3schools.com/howto/tryit.asp?filename=tryhow_css_login_form
# -*- coding: utf-8 -*-
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)
driver.quit()
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)
driver.quit()
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 -*-
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)
driver.quit()
<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
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'
clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")
•XPath Tutorial
<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>
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.
<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')
<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')