2016-02-16 6 views
1

В настоящее время я программирую примеры в «Test-Driven Development with Python», точнее, первый функциональный тест.Force Selenium в Python, чтобы ждать, пока браузер не будет выполнен. Загрузка

Основные части моего кода следующим образом:

def setUp(self): 
    self.browser = webdriver.Firefox() 
    self.browser.implicitly_wait(20) 

Я говорю Селен сделать неявное ожидание в течение 20 секунд до тех пор, пока не найдет то, что он ищет.

inputbox = self.browser.find_element_by_id('id_new_item') 
    self.assertEqual(
     inputbox.get_attribute('placeholder'), 
     'Enter a To-Do item' 
    ) 

    inputbox.send_keys('Buy peacock feathers') 
    inputbox.send_keys(Keys.ENTER) 

    table = self.browser.find_element_by_id('id_list_table') 
    rows = table.find_elements_by_tag_name('tr') 
    self.assertIn('1: Buy feather peacocks', [row.text for row in rows]) 

Самая большая проблема здесь в следующих строках:

inputbox.send_keys('Buy peacock feathers') 
    inputbox.send_keys(Keys.ENTER) 

    table = self.browser.find_element_by_id('id_list_table') 
  1. Он пишет: «Купить павлиньи перья» в поле ввода.
  2. Он нажимает кнопку ввода.
  3. Это, сразу после, пытается найти предметы в таблице.

Проблема в том, что мой компьютер работает не так быстро. К тому моменту, когда элементы найдены, браузер все еще пытается загрузить скрипт, и утверждение не выполняется.

Я знаю, что существует два типа ожиданий для Селена: неявный (уже примененный) и явный (некоторые исследования на нем). Мои проблемы с обеими являются следующими:

  • неявных ожидания бесполезны, потому что элементов находятся, независимо от того, детали, что я ищу, или нет.
  • Явные ожидания бесполезны, потому что страница такая же как до, так и после отправки формы, и как таковой ждать нечего.
  • time.sleep() зависает, если используется слишком много.
  • Да, я также проверил, что item_text правильно ссылки, в том числе name атрибута :)

Каковы мои другие варианты? Что я могу сделать, чтобы заставить Selenium ждать, пока страница не будет загружена? Спасибо заранее.

EDIT: вид выглядит следующим образом, следуя примеру в книге.

<html> 
    <head> 
     <title>Lista de Quehaceres</title> 
    </head> 
    <body> 
     <h1>Tu Lista de Quehaceres</h1> 
     <form method="POST"> 
      <input id="id_new_item" name="item_text" placeholder="Entre un ítem de quehacer" /> 
      {% csrf_token %} 
     </form> 
     <table id="id_list_table"> 
      <tr><td>1: {{ new_item_text }}</td></tr> 
     </table> 
    </body> 
</html> 

ответ

1

Вы можете ждать определенного text to be present in element с помощью WebDriverWait:

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 


inputbox.send_keys('Buy peacock feathers') 
inputbox.send_keys(Keys.ENTER) 

table = WebDriverWait(driver, 10).until(
    EC.text_to_be_present_in_element((By.CSS_SELECTOR, "table#id_list_table tr td"), "Buy peacock feathers") 
) 
+0

Я пытаюсь следовать примеру в книге, и таблица присутствует с самого начала. Я редактировал свой OP с кодом вида. –

+0

@ user1231958 okay, gotcha, обновлено с новой идеей. Надеюсь, поможет. – alecxe

+0

Я собираюсь принять ваш вопрос, потому что я понял, что случилось что-то еще, что убивает Селен, но я понятия не имею, что это может быть. И ваша идея тоже будет полезна! Спасибо! –

Смежные вопросы