其他分享
首页 > 其他分享> > 如何用selenium测试jquery ajax标签?

如何用selenium测试jquery ajax标签?

作者:互联网

我正在使用selenium测试django应用程序,我的一个页面使用jquery ui tabs element.其中一个选项卡包含一个列出一些用户的简单表,并通过ajax加载.使用该应用程序时,该选项卡工作得很好,但是当使用selenium自动执行测试时,该选项卡似乎不会加载它的内容!
我自己在python中编写测试.起初,我正在使用selenium RC的click方法,但正如我从先前的测试中学到的那样,当涉及到锚标签时,这是相当错误的,所以我采用了之前使用的解决方案:wait_for_condition方法和明确地调用了tab单击事件(甚至是load事件!)然而选项卡仍然无效!
    我在这里绝望,我的大多数测试依赖于那个页面,其中几乎一半都在那张桌子上,但是,唉,似乎selenium搞砸了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)

解决方法:

这可能是一些事情.可能是Selenium在点击锚点时遇到了麻烦,但实际上我没有听说过这种麻烦,听起来不太可能.听起来像click()方法返回OK,它没有给你“找不到元素”,对吧?当你点击jquery选项卡时,javascript就是没有按照预期进行操作.根据我的经验,这通常归结为相同的问题 – 因为Selenium执行得非常快,当javascript渲染页面的部分并且有时当Selenium与页面的动态生成部分交互时连续影响DOM(比如点击这个tab),它与之交互的作品取决于其他一些实际尚未完全装载的作品.事实上它可能距离完全加载几微秒,但是硒太快了.你已经理解了这一点,你有一个正确的想法,wait_for条件寻找要加载的选项卡.我的猜测可能还不够长.你必须找到一些评估来说明整个UI标签的内容是加载和渲染的.选项卡API是否有一些回调可以添加以设置“完成加载”变量,还是会公开这样的变量?除非找出正确的表达式来找到实时准备点击UI标签的时间点,这可能会很棘手,你可以采取彻底的暂停来确保页面的一部分准备就绪你与它互动.我认为在代码中睡眠(2),甚至睡眠(5)等没有问题,如果有必要让它工作.一种方法是你可以测试这是真正发生的事情是通过在交互式解释器中启动场景(得到爱的Python,在Java中打败这种情况).逐行粘贴代码以到达故障点,或在故障点注释掉你的拆解方法中的selenium.stop()调用和任何测试代码,这样它就会打开并退出selenium窗口.然后在交互式解释器中实例化一个selenium对象并劫持打开的会话:

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’)时,tab guts会都装满了,准备出发了.只是当Python进行调用时,当这些动态渲染进行时,它对浏览器来说太快了.如果通过这样的硒手动完成点击工作正常,那么你知道这是一个时间问题.找到正确的wait_for_condition或屈尊于python sleep().否则,如果执行此操作时单击仍然不起作用,则可能是使用定位器时出现问题.选项卡UI在选项卡结构的某些部分上有一个单击或鼠标或焦点或某种事件处理程序,可能只是找到要单击的选项卡的正确部分或要触发的正确事件.如果它不是那么它也许就像你提到Selenium和Jquery UI之间的某种奇怪的互动,但这会让我感到惊讶,我很想知道.使用get_eval()来查看javascript中发生了什么,如果是这样的话.这听起来像是一个时间问题.

标签:python,unit-testing,django,jquery-ui,selenium-rc
来源: https://codeday.me/bug/20190621/1258095.html