Как проверить вкладки JQuery Ajax с селеном? - PullRequest
4 голосов
/ 25 июня 2010

Я тестирую приложение django с селеном, и на одной из моих страниц используется элемент jquery ui tabs . Одна из вкладок содержит простую таблицу со списком некоторых пользователей и загружается через ajax. При использовании приложения вкладка работает просто отлично, но при автоматизации теста с селеном вкладка не загружается! Я сам пишу тесты на python. Сначала я использовал метод click для selenium RC, но, как я с сожалением узнал из предыдущего теста, он довольно ошибочен, когда дело доходит до якорных тегов, поэтому я прибег к решению, которое использовал before: метод wait_for_condition, явно вызвавший событие нажатия вкладки (и даже событие загрузки!), и тем не менее вкладка все еще не работает!

Я в отчаянии, большинство моих тестов зависят от этой страницы, и почти половина из них находится на этой таблице, но, увы, кажется, что селен портит JavaScript! (У меня есть другие тесты в классе, и они выполняются просто отлично, поэтому на уровне сервера ничего странного не происходит, кажется, это проблема, вызванная селеном на стороне клиента) Мой тестовый код похож на это:

class TestMyApp(TransactionTestCase):
urls = 'myapp.test_urls'

def setUp(self):
    self.verificationErrors = []
    self.selenium = selenium("localhost", 4444, "*chrome", "http://localhost:8000/")
    self.selenium.start()
    #self.selenium.set_speed(2000)
    self.selenium.window_maximize()
def test_users_list(self):
    """Test that an app's users are correctly listed"""
    sel = self.selenium
    users = []
    for u in range(settings.FREE_USER_LIMIT/2):
        users.append(self.app.users.create(name="testUser_%s"%uuid4()))

    sel.open("/")        
    sel.wait_for_page_to_load("30000")
    sel.wait_for_condition('selenium.browserbot.getCurrentWindow().jQuery("#tabs").tabs("select",1);\
    selenium.browserbot.getCurrentWindow().jQuery("#tabs").tabs("load",1);',
                             3000)
    for user in users:
        try: self.failUnless(sel.is_text_present(user.name))
        except AssertionError, e: self.verificationErrors.append(str(e))
        try: self.failUnless(sel.is_text_present(str(user.added.date())))
        except AssertionError, e: self.verificationErrors.append(str(e))
def tearDown(self):
    self.selenium.stop()
    self.assertEqual([], self.verificationErrors)

1 Ответ

5 голосов
/ 25 июня 2010

Это может быть несколько вещей.Возможно, у Selenium возникают проблемы с щелчком якоря, но я на самом деле не слышал об этой проблеме, и это звучит менее вероятно.Похоже, что метод click () возвращает OK, он не дает вам «элемент не найден», верно?Когда вы нажимаете на вкладку jquery, javascript просто не выполняет ожидаемого.По моему опыту, это обычно сводится к одной и той же проблеме - поскольку Selenium выполняется очень быстро, когда javascript визуализирует части страницы и непрерывно воздействует на DOM, когда Selenium взаимодействует с динамически генерируемыми частями страницы (скажем, нажмите на этувкладка), часть, с которой он взаимодействует, зависит от какой-то другой части, которая на самом деле еще не загружена полностью.Это, вероятно, микросекунды от полной загрузки на самом деле, но селен слишком быстро.Конечно, вы уже поняли это, у вас есть правильная идея с условием wait_for, которое ищет вкладки для загрузки.Я думаю, что это, вероятно, просто недостаточно.Вы должны найти некоторую оценку, которая говорит о том, что вся вкладка пользовательского интерфейса загружена и визуализирована.Имеется ли в API вкладок какие-либо обратные вызовы, которые вы можете добавить, чтобы установить переменную «готово», или он предоставляет такую ​​переменную?Если выяснить, каково правильное выражение, чтобы найти момент времени, когда вкладки пользовательского интерфейса фактически готовы к щелчку, что может быть сложно, вы можете использовать прямые паузы, чтобы убедиться, что часть страницы готова перейти доВы взаимодействуете с этим.Я не вижу проблем в sleep (2) или даже sleep (5) и т. Д. В коде, если необходимо заставить его работать.Один из способов проверить, что это действительно так, - запустить сценарий в интерактивном интерпретаторе (должен любить Python, без труда делать это на Java).Вставляйте код построчно, чтобы добраться до проблемной точки, или закомментируйте вызов selenium.stop () в вашем методе разрыва и любой тестовый код после проблемной точки, чтобы оставить окно селена открытым и выйти.Затем создайте экземпляр объекта селена в интерактивном интерпретаторе и взломайте открытый сеанс:

selenium = selenium("localhost", 4444, "*chrome", "http://localhost:8000/")
selenium.sessionId = "0asdd234234023424foo" #Get this from the Se window

..., чтобы получить интерактивное управление окном.Затем вы можете увидеть, как совершать selenium.click() или совершать selenium.get_eval('...js...') вызовы, чтобы исследовать ландшафт javascript в тот момент.Я предполагаю, что когда вы сделаете это, click() будет работать нормально, когда вы наберете его, потому что к моменту загрузки сеанса и начала ввода selenium.click('blah_tab_locator'), все вкладки будут загружены и готовыидти.Просто, когда Python делает вызовы, он делает это слишком быстро для браузера, когда происходят эти динамические рендеринг.Если щелчок работает нормально, когда вы делаете это вручную через селен, как это, то вы знаете, что это проблема синхронизации.Найдите правильное ожидание для условия или снисходите до питона sleep().В противном случае, если щелчок по-прежнему не работает, когда вы делаете это, возможно, это проблема с используемым локатором.Пользовательский интерфейс вкладки имеет щелчок или щелчок мыши, или фокус, или какой-то другой обработчик событий в некоторой части структуры вкладки, возможно, это просто поиск правой части вкладки, которую нужно щелкнуть, или правильное событие, которое нужно запустить.Если это не так, то, возможно, это может быть так, как вы упомянули о каком-то странном взаимодействии между Selenium и Jquery UI, но это удивило бы меня, и мне было бы интересно узнать.Поэкспериментируйте с get_eval (), чтобы увидеть, что происходит в JavaScript, если это так.Это звучит как вопрос времени для меня, хотя.

...