Перейти к содержимому

Фотография

Python + Selenium webdriver +Page object + я новенький + Ожидания


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 19

#1 zolkin

zolkin

    Новый участник

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Золкин Дмитрий Викторович

Отправлено 28 января 2016 - 08:52

Подскажите пожалуйста.

Использую selenium неделю.

В программировании, тоже особо не селен знаю азы.

Создаю 3 файла.

1.Файл,где я храню локаторы (lokators.py)

В нем я пишу следующее:

 

class MainPageLocators(object):

TITLE_19_1 = (By.Xpath, '//treeitem/ul/li[1]'/div/span)

TITLE_19_1 = (By.Xpath, '//treeitem/ul/li[2]'/div/span)

 

ну и тд

2.Файл(page), где как я понял я храню класс страницы в котором описываю действия над элементами из файла lokators.py

В нем я пишу что то типа 

 

class BasePage(object):

def __init__(self, driver):

   self.driver = driver

 

 

class MainPage(BasePage):

 

определяю методы,которые ждет появления элемента на странице и жмет на него вот таким образом

 

def click_button(self, by , btn)

 wait = WebDriverWait(self.driver, 10)

 try:

     element = wait.until(lamda driver: self.driver.find_element(by, btn)).click()

 expect TimeoutException:

print "что то"

 

 

def click_to_type_ref(self, by , ref)

 wait = WebDriverWait(self.driver, 10) ----не работает как задумано или я что то не понимаю

 try:

     element = wait.until(lamda driver: self.driver.find_element(by, ref)).click()

 expect TimeoutException:

 

 

3.Собственно файл где я пишу тесты использую Unittest

 

class SimpleTestCase(unittest.TestCase):

 

def setUp(self):

     self.driver =webdriver.Firefox() 

     self.driver.get("")

     self.driver.implisetly_wait(10) ---- не работает тут тоже указал ждать

 

Собственно тест

def create_19_1_form(self):

main_page =page.MainPage(self.driver)

main_page.click_donos_link() ## Метод не описал но он просто жмет на ссылку

self.driver.self.driver.impliсetly_wait(10)              !!!!!!Если удалить эту строчку кода тесты не выполняются!!!!!!!

main_page.click_button(*MainPageLocators.ADD_BUTTON)

self.driver.self.driver.implisetly_wait(10)  !!!! Иногда сюда приходиться дописывать

main_page.click_to_type_ref(*MainPageLocators.TITLE_19_1)

assert "Текст" in "Какой то текст"

 

 

 

Подскажите пожалуйста, почему в тесте если убрать строчку ожидания все ломается!!(Выдается ошибка StateElementReferenceException:Element no found in the cash)???? Причем не постоянно,то проходят все тесты то падает все...Если оставить ожидания именно перед теми строчками, что иногда ломаются() в самом тесте процентов 99% тесты проходят Может ли быть проблема в браузере FIREFOX 29 версии другую использовать никак не могу((((


  • 0

#2 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 28 января 2016 - 09:03

Подскажите пожалуйста.

Использую selenium неделю.

В программировании, тоже особо не селен знаю азы.

Создаю 3 файла.

1.Файл где я храню локаторы (lokators.py)

В нем я пишу следующее:

 

class MainPageLocators:

TITLE_19_1 = 

продолжай


  • 0

#3 BadMF

BadMF

    Специалист

  • Members
  • PipPipPipPipPip
  • 809 сообщений
  • ФИО:Dmitry Petrov

Отправлено 28 января 2016 - 09:20

тоже считаю, что не стоит бросать, тяжело только в начале, потом и переменным значения сможете без волнения и обмороков присваивать.


  • 0

#4 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 28 января 2016 - 09:36


     self.driver.implisetly_wait(10) ---- не работает тут тоже указал ждать

 

self.driver.implicitly_wait(10)


  • 0

#5 zolkin

zolkin

    Новый участник

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Золкин Дмитрий Викторович

Отправлено 28 января 2016 - 09:37

тоже считаю, что не стоит бросать, тяжело только в начале, потом и переменным значения сможете без волнения и обмороков присваивать.

а что неправильно пример был взят из интернета.Какая разница как я переменным значения присваиваю???


  • 0

#6 zolkin

zolkin

    Новый участник

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Золкин Дмитрий Викторович

Отправлено 28 января 2016 - 09:39

 


     self.driver.implisetly_wait(10) ---- не работает тут тоже указал ждать

 

self.driver.implicitly_wait(10)

 

ну ошибки кода могут быть я не вставлял из рабочего кода....Код то запускается проблема не в этом(( ну в смысле не в синтаксисе....


  • 0

#7 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 28 января 2016 - 09:48

Попробуй этой функцией дожидаться элемента

def waitForElementPresent(self,xpath,timer=10):
		drv=self.DRV
		WebDriverWait(drv,timer).until(expected_conditions.presence_of_element_located((By.XPATH,xpath)))

  • 0

#8 zolkin

zolkin

    Новый участник

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Золкин Дмитрий Викторович

Отправлено 28 января 2016 - 09:53

 

Попробуй этой функцией дожидаться элемента

def waitForElementPresent(self,xpath,timer=10):
		drv=self.DRV
		WebDriverWait(drv,timer).until(EC.presence_of_element_located((By.XPATH,xpath)))

Спасибо большое попробую

 


  • 0

#9 zolkin

zolkin

    Новый участник

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Золкин Дмитрий Викторович

Отправлено 28 января 2016 - 12:42

 

 

Попробуй этой функцией дожидаться элемента

def waitForElementPresent(self,xpath,timer=10):
		drv=self.DRV
		WebDriverWait(drv,timer).until(EC.presence_of_element_located((By.XPATH,xpath)))

Спасибо большое попробую

 

 

Попробовал не помогло(( то запускается то нет.... 


  • 0

#10 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 28 января 2016 - 12:47

 

 

 

Попробуй этой функцией дожидаться элемента

def waitForElementPresent(self,xpath,timer=10):
		drv=self.DRV
		WebDriverWait(drv,timer).until(EC.presence_of_element_located((By.XPATH,xpath)))

Спасибо большое попробую

 

 

Попробовал не помогло(( то запускается то нет.... 

 

какую ошибку выдает ?


  • 0

#11 zolkin

zolkin

    Новый участник

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Золкин Дмитрий Викторович

Отправлено 28 января 2016 - 12:48

А подскажите пожалуйста, как нибудь можно запустить в консоле мой файл test.py(в котором написаны мои тесты)...Я создал проект в Pycharm там создал 3 файла.Перехожу в директорию где лежат файлы пытаюсь запустить  test.py и там тишина...Просто ничего не происходит


  • 0

#12 zolkin

zolkin

    Новый участник

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Золкин Дмитрий Викторович

Отправлено 28 января 2016 - 12:51

 

 

 

 

Попробуй этой функцией дожидаться элемента

def waitForElementPresent(self,xpath,timer=10):
		drv=self.DRV
		WebDriverWait(drv,timer).until(EC.presence_of_element_located((By.XPATH,xpath)))

Спасибо большое попробую

 

 

Попробовал не помогло(( то запускается то нет.... 

 

какую ошибку выдает ?

 

Ой прошу прощения я же писал ошибку  StateElementReferenceException:Element no found in the cash perhaps the page has changed since it was look up


  • 0

#13 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 28 января 2016 - 12:55

А подскажите пожалуйста, как нибудь можно запустить в консоле мой файл test.py(в котором написаны мои тесты)...Я создал проект в Pycharm там создал 3 файла.Перехожу в директорию где лежат файлы пытаюсь запустить  test.py и там тишина...Просто ничего не происходит

ты имеешь ввиду в терминале ?

python test.py

в директории , где лежит тест


  • 0

#14 zolkin

zolkin

    Новый участник

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Золкин Дмитрий Викторович

Отправлено 28 января 2016 - 13:01

 

А подскажите пожалуйста, как нибудь можно запустить в консоле мой файл test.py(в котором написаны мои тесты)...Я создал проект в Pycharm там создал 3 файла.Перехожу в директорию где лежат файлы пытаюсь запустить  test.py и там тишина...Просто ничего не происходит

ты имеешь ввиду в терминале ?

python test.py

в директории , где лежит тест

Просто тишина ...я дописал в файле !#/usr/bin/env python в среде если жать run тесты запускаются.в терминале ничего просто тишина 


  • 0

#15 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 28 января 2016 - 13:59

 

 

А подскажите пожалуйста, как нибудь можно запустить в консоле мой файл test.py(в котором написаны мои тесты)...Я создал проект в Pycharm там создал 3 файла.Перехожу в директорию где лежат файлы пытаюсь запустить  test.py и там тишина...Просто ничего не происходит

ты имеешь ввиду в терминале ?

python test.py

в директории , где лежит тест

Просто тишина ...я дописал в файле !#/usr/bin/env python в среде если жать run тесты запускаются.в терминале ничего просто тишина 

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
import time,unittest
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver import TouchActions
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException
from selenium.common.exceptions import InvalidSwitchToTargetException
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import InvalidElementStateException
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import UnexpectedAlertPresentException
from selenium.common.exceptions import NoAlertPresentException

class test_case():

	def test_step():
		el="//input[@id='inboxfield']"
		DRV=webdriver.Firefox()
		DRV.maximize_window()
		DRV.get("http://mailinator.com/")
		def waitForElementPresent(xpath,timer=10):
			WebDriverWait(DRV,timer).until(EC.presence_of_element_located((By.XPATH,xpath)))
                waitForElementPresent(el)
		DRV.find_element_by_xpath(el).send_keys(u"Привет, zolkin")
		time.sleep(3)
		DRV.quit()

	test_step()	

развлекайся


  • 0

#16 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 29 января 2016 - 07:26

Относительно недавно наткнулась на то, что в WebDriverWait можно явно указать исключения, которые он должен игнорировать. 

 

Например:

    public WebDriverWait getWait() {
        if (wait == null) {
            wait = new WebDriverWait(driver, WAIT_PERIOD);
            wait.pollingEvery(500, TimeUnit.MILLISECONDS)
                .ignoring(StaleElementReferenceException.class);
        }
        return wait;
    }

Предполагаю, что при использовании этого wait - StaleElementReferenceException не будет прерывать ожидания, элемент будет продолжать ожидаться. 

Гарантировать не могу, т.к. только недавно нашла и ещё толком не перепроверяла.

Но если работает так, как я думаю - вам надо поискать аналог для Python и попробовать также указать игнорирование этого экспешена.


  • 0

#17 leftCh

leftCh

    Постоянный участник

  • Members
  • PipPipPip
  • 179 сообщений

Отправлено 29 января 2016 - 08:30

А подскажите пожалуйста, как нибудь можно запустить в консоле мой файл test.py(в котором написаны мои тесты)...Я создал проект в Pycharm там создал 3 файла.Перехожу в директорию где лежат файлы пытаюсь запустить  test.py и там тишина...Просто ничего не происходит

Я так понимаю linux

 

Просто запустить программу на питоне

Вариант 1

  •     #!/usr/bin/python
  •     Сделать файл исполняемым

Вариант 2

в консоли, в директории с файлом: python filename.py

 

Если там метод класса наследника от TestCase то надо добавить в код

if __name__ == '__main__':
    unittest.main()

Подробнее в документации https://docs.python....y/unittest.html

 

 

 

Ой прошу прощения я же писал ошибку  StateElementReferenceException:Element no found in the cash perhaps the page has changed since it was look up

Скорее всего, элемент на странице исчезает, и затем появляется снова с тем же локатором. Селениум успевает его найти  перед тем как он исчезнет. Тест можно сделать стабильным прописав фиксированный sleep перед поиском. Но это плохой способ, хороший можно придумать только посмотрев проект, думайте сами 


  • 0

#18 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 29 января 2016 - 08:37

 

А подскажите пожалуйста, как нибудь можно запустить в консоле мой файл test.py(в котором написаны мои тесты)...Я создал проект в Pycharm там создал 3 файла.Перехожу в директорию где лежат файлы пытаюсь запустить  test.py и там тишина...Просто ничего не происходит

Я так понимаю linux

Вариант 1

  •     #!/usr/bin/python
  •     Сделать файл исполняемым

Вариант 2

в консоли, в директории с файлом: python filename.py

 

нет, функция не вызывалась просто


  • 0

#19 leftCh

leftCh

    Постоянный участник

  • Members
  • PipPipPip
  • 179 сообщений

Отправлено 29 января 2016 - 08:42

нет, функция не вызывалась просто

 

Да я добавила уже )


  • 0

#20 zolkin

zolkin

    Новый участник

  • Members
  • Pip
  • 16 сообщений
  • ФИО:Золкин Дмитрий Викторович

Отправлено 03 февраля 2016 - 07:59

Спасибо всем за советы!Вроде все заработало.


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных