Israel Yance
En el código al parecer falto invocar el click_submit con paréntesis, ya que sin paréntesis se cierra sin que aparezca los resultados de búsqueda.
def search(self, keyword): self.type_search(keyword) self.click_submit()
Gerardo Alberto Soto Alvarez del Castillo
Tienes razón, buen aporte!
Jorge Heli Rueda Uribe
¡Tremendo aporte!
Gerardo Alberto Soto Alvarez del Castillo
Page Object Model es un patrón de diseño utilizado en Testing, el cual, tiene beneficios para la elaboración de Tests. Funcionamiento: -En vez de tener nuestros Test en un solo archivo, los tendremos abstraídos en una nueva capa llamada Pages, donde tendremos los Tests en archivos independientes, haciendo referencia al sitio donde se aplica (Home, Login, etc).
A los archivos independientes se les agregará un nuevo archivo que es el Page Object, el cual se encargará de tomar los Tests que se están realizando y validarlas contra los Tests Cases.
Royer Guerrero Pinilla
Creo que he usado POM sin saberlo? curioso...🤔
Jose Antonio Rojas Ollarves
Si aveces utilizamos herramientas que no sabemos que tenian nombre o defenicion como tal
Jonatan Schenfeld
Estaria bueno que muestres tambien Page Factory
Ivan -
En los metodos de google_page.py, les recomiendo que usen la propiedad
self.search_locator
En lugar de directamente la 'q'. Por ejemplo:
input_field = self._driver.find_element_by_name(self.search_locator)
Asi si tiene que buscar el elemento por el que buscan no tiene que cambiarlo en todas partes.
Jose Antonio Rojas Ollarves
Antonio Demarco Bonino
Otra clase que me hizo sudar y sacar lo mejor de mí. Muchas gracias Héctor.
Cristian David Restrepo Marin
X2, cada clase me tomó mucho mas tiempo
José Ángel Gutiérrez Ramos
Excelente clase! Buena explicación.
karen gonzalez
Miguel Andres Rendon Reyes
En vez de manejar las pruebas en solo archivo, se manejan pruebas inpendientes. Cada uno de estos archivos, se les llaman pages, haciendo referencia. al sitio en dónde se aplican.Creamos una por ejemplo, para el home, para el login, para el signup. A los archivos de todo el sitio web, creamos una capa de abstracción. Esto último lo logramos con otro archivo: El Page Object. El que se encargará de tomar las pruebas que se están realizando, para validarlas con los Test Cases.
Daniel Castillo
Jeyson David Vargas Crespo
Kevin J. Zea Alvarado
Dice que GooglePage no tiene el atributo open().
¿No debería llevar GooglePage(self._driver)?
Luis Lira
Dice que GooglePage no tiene el atributo Open, tendría que verificar que se está importando correctamente la clase que necesita o quie hayas creador bien la forma el código de la clase GooglePage.
Juan Nicolas Patiño Rodriguez
Si al momento de ejecutar el código les aparece el error:
AttributeError: ‘GooglePage’ object has no attribute ‘open’
Deben fijarse en la identación de sus metodos en el archivo
google_page.py
Puede que todos los métodos estén al interior del constructor:
def __init__(self, driver):
En cuyo caso simplemente deben eliminar la identación desde el primer decorador en adelante
@property def is_loaded(self):
De esta manera se garantiza el acceso a los metodos en el archivo
google_test.py
Espero que les funcione como en mi caso. Saludos!!!
Lautaro Cabral
Pues parece una POO, donde los objetos son Pages
Juan Carlos Ortiz Romero
Juan Carlos Ortiz Romero
import unittest from selenium import webdriver from google_page import GooglePage class GoogleTest(unittest.TestCase): @classmethod def setUp(cls): cls.driver = webdriver.Chrome(executable_path='../chromedriver') def test_search(self): google = GooglePage(self.driver) google.open() google.search('Platzi') self.assertEqual('Platzi', google.keyword) @classmethod def tearDown(cls): cls.driver.close() if __name__ == "__main__": unittest.main(verbosity=2)
Miguel Andres Rendon Reyes
El page object Model, es un patrón de diseño utilizado en testing. Que nos brindan ventajas en nuestras automatizaciones.
Eduardo Jimenez
Estaba teniendo un error desde hace 3 dias para que se corriera este codigo. La verdad estaba 100% perdido y no encontre un comentario que me ayudara.
Pensaba que era algun typo del codigo, pero despues de horas de revisar y comparar el codigo no encontraba la solucion. Intente correr los scripts de clases pasadas y extrañamente tampoco funcionaban. Asi que utilice los reportes de HTML para tener una forma mas amigable de leer el error.
Al final resulto ser que el webdriver estaba desactualizado, asi que unicamente volviendo a instalar el driver se soluciono, espero que a alguien mas le ayude este comentario.
Jorge Heli Rueda Uribe
¿Que significará el _ que está antes de _driver?
_driver
David Alejandro Aparicio Grandas
En python se suele usar underscore antes del nombre de métodos o atributos para indicar que son privados a la clase y no deben ser usados o llamados por fuera de la misma, no tiene ningún efecto a nivel de ejecución, es mas una convención entre desarrolladores
Jorge Heli Rueda Uribe
Excelente. Muchas gracias por la completa aclaración David.
Saludos amigos hice el ejercicio en Firefox aqui les comparto el codigo:
| Test_google . py
import unittest from selenium import webdriver from google_page import Google class GoogleTest(unittest.TestCase): @classmethod#Decoradores para correr en una sola instancia del navegador def setUpClass(cls): cls.driver = webdriver.Firefox(executable_path= r'./geckodriver.exe') def test_search(self): google = Google(self.driver) google.open() google.search('Python') self.assertEqual('Python', google.keyword) @classmethod def tearDownClass(cls): cls.driver.close() if __name__ == '__main__': unittest.main()
google_page .py
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class Google(object): def __init__(self,driver): self._driver = driver self._url = 'https://google.com' self.search_locator = 'q' @property #Propiedad para busqueda def is_loaded(self): WebDriverWait(self._driver , 10).until(EC.presence_of_element_located((By.NAME, 'q'))) return True @property def keyword(self): input_field = self._driver.find_element_by_name('q') return input_field.get_attribute('value') def open(self): self._driver.get(self._url) def type_search(self, keyword): input_field = self._driver.find_element_by_name('q') input_field.send_keys(keyword) def click_submit(self): button_submit = self._driver.find_element_by_xpath('/html/body/div[1]/div[3]/form/div[2]/div[1]/div[1]/div/div[1]/div/span/svg') button_submit.click() def search(self, keyword): self.type_search(keyword) self.click_submit
Hola!, este es mo codigo de la clase
test_google.py
import unittest from selenium import webdriver from google_page import GooglePage class GoogleTest(unittest.TestCase): @classmethod # para que corran en una sola instancia del navegador def setUp(cls): cls.driver = webdriver.Chrome(executable_path=r'C:\Users\kren1\Documents\curso\Python_con_Selenium\chromedriver.exe') def test_search(self): google = GooglePage(self.driver) google.open() google.search('Platzi') self.assertEqual('Platzi', google.keyword) @classmethod def tearDownClass(cls): cls.driver.close() if __name__ =="__main__": unittest.main(verbosity=2)
google_page.py
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class GooglePage(object): def __init__(self,driver): self._driver = driver self._url = 'https://google.com' self.search_locate = 'q' @property def is_located(self): WebDriverWait(self._driver, 10).until(EC.presence_of_all_elements_located((By.NAME, 'q'))) return True @property def keyword(self): input_field = self._driver.find_element_by_name('q') return input_field.get_attribute('value') def open(self): self._driver.get(self._url) def type_search(self,keyword): input_field = self._driver.find_element_by_name('q') input_field.send_keys(keyword) def click_submit(self): input_field = self._driver.find_element_by_name('q') input_field.submit() def search(self, keyword): self.type_search(keyword) self.click_submit()
Hola yo tenia un problema que cuando escribe el termino la barra de google despliega como varios resultados y no hace el submit, lo resolvi de esta forma espero le sirva a alguien
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class GooglePage(object): def __init__(self, driver): self._driver = webdriver.Chrome(executable_path='./chromedriver') self._url = 'https://google.com ' self.search_locator = 'q' @property def is_loaded(self): WebDriverWait(self._driver, 10).until(EC.presence_of_element_located((By.NAME, 'q'))) return True @property def keyword(self): input_field = self._driver.find_element_by_name('q') return input_field.get_attribute('value') def open(self): self._driver.get(self._url) def type_search(self, keyword): input_field = self._driver.find_element_by_name('q') input_field.send_keys(keyword) #buscando el logo y dandole click no dejamos que eso aparezca self._driver.find_element_by_xpath('//*[@id="hplogo"]').click() def click_submit(self): input_field = self._driver.find_element_by_name('q') input_field.submit() def search(self, keyword): self.type_search(keyword) #y luego dandole click al boton de busqueda self._driver.find_element_by_xpath('//*[@id="tsf"]/div[2]/div[1]/div[3]/center/input[1]').click()
Hola, me pueden ayudar porfa, me saca el siguiente error:
Este es el código de ambos archivos:
def open(self): self._driver.get(self._url) def test_search(self): google = GooglePage(self.driver) google.open() google.search('Platzi') self.assertEqual('Platzi', google.keyword)``` Agradezco su ayuda, ya que he corregido varias cosas pero me sigue saliendo ese error
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class GooglePage(object): def __init__(self, driver): self._driver = driver self._url = 'https://google.com' self.search_locator = 'q' @property def is_loaded(self): WebDriverWait(self._driver, 10).until( EC.presence_of_element_located((By.NAME, 'q'))) return True @property def keyword(self): input_field = self._driver.find_element_by_name('q') return input_field.get_attribute('value') def open(self): self._driver.get(self._url) def type_search(self, keyword): input_field = self._driver.find_element_by_name('q') input_field.send_keys(keyword) def click_submit(self): input_field = self._driver.find_element_by_name('q') input_field.submit() def search(self, keyword): self.type_search(keyword) self.click_submit