【问题标题】:Page elements not recognized on different machine while initializing through PageFactory method通过 PageFactory 方法初始化时在不同机器上无法识别的页面元素
【发布时间】:2015-08-28 13:17:42
【问题描述】:

亲爱的朋友和同事

这是一个奇怪的场景,或者可能有人已经面临这个问题并不确定,但你自己看看。

考虑使用 PageFactory 方法初始化的 5 个字段。登录页面上的 3 个字段已加载到 DOM 中,其余 2 个(登录后的主页)字段尚未加载到 DOM 中。

现在,当我使用网格在其他客户端上从我的机器远程启动登录测试时,它工作正常。

但是当我使用网格在同一客户端上从另一台机器远程启动测试时不起作用。

我的工具集 语言绑定 => C# WebDriver 2.47.0, TestRunner => Gallio/mBUnit, Browser => Any(Chrome/FF), DotNet Grid Standalone Server 2.47.1

我有一个登录功能,其中所有页面元素都通过如下所示的 PageFactory 方法初始化

公共登录功能(驱动程序) { PageFactory.InitElements(driver, this);
}

元素声明如下

    [FindsBy(How = How.CssSelector, Using = @"#UserName")]
    [CacheLookup]
    public IWebElement UserNameTextField { get; set; }

    [FindsBy(How = How.CssSelector, Using = @"#Password")]
    [CacheLookup]
    public IWebElement PasswordTextField { get; set; }

    [FindsBy(How = How.CssSelector, Using = @".span2>input")] //input[@value='Sign in']")]
    [CacheLookup]
    public IWebElement LoginButton { get; set; }

    [FindsBy(How = How.XPath, Using = @"//h2[contains(text(),'Welcome, admin')]")]
    [CacheLookup]
    public IWebElement WelcomeFormMessageText { get; set; }

   [FindsBy(How = How.Id, Using = @"tabslist")]
    [CacheLookup]
    public IWebElement MainTabsList { get; set; }

现在当 PageFactory.InitElements(driver, this);语句执行时,在初始化 DOM 中实际上不存在的 WelcomeFormMessageText IWebElement 时测试失败。登录成功后,这些元素会出现在主页上。

现在的问题是,当我从我的机器上运行它时,相同的测试运行良好,而当我从另一台机器上运行它时却失败了:-(

两台机器配置相同,具有相同的操作系统、浏览器版本、位系统等。

我尝试在第三台机器上运行测试,但也失败了。它似乎只从我的 m/c 运行。

有人看过这个问题吗?或者有什么线索?

提前致谢。

【问题讨论】:

    标签: selenium webdriver


    【解决方案1】:

    在远程机器上运行测试通常比在本地运行要慢。 我认为这是由于登录后延迟到远程计算机上的主页,因此您无法看到主页上的元素,因为主页尚未加载。

    尝试在登录后添加等待,然后访问主页上的元素,它应该可以工作。

    您还需要在登录后重新初始化 PageFactory 以获取页面上较新的元素。

    不过,我强烈建议为登录页面和主页设置单独的 PageFactory。

    【讨论】:

    • 不,这与页面加载无关。它是别的东西。原因是,当我评论 WelcomeFormMessageText 元素时,它并没有失败,它在下一个元素上失败这意味着,当页面可用时需要初始化对象。但是如果是这样的话,当我从我的机器上运行测试时它是怎么工作的呢?这就是我真正的问题所在。
    • 不,这与页面加载无关。它是别的东西。原因是,当我评论 WelcomeFormMessageText 元素时,它并没有失败,它在下一个元素上失败这意味着,当页面可用时需要初始化对象。但是如果是这样的话,当我从我的机器上运行测试时它是怎么工作的呢?这就是我真正的问题所在。自 WebDriver 版本为 2.42 的 1 年以来,我一直在运行 300 多次测试,从未遇到过这个问题。
    • 好的,我们不要重新初始化页面,只需在登录后尝试添加等待,看看它是否通过远程机器,我们将从那里获取。
    • 我想,我没有把事情放对。我的意思是,当我说从我的 m/c 运行测试时,我从我的 m/c 开始测试,但实际测试在另一台客户端机器上的浏览器中运行,例如(M1)通过网格。当我从另一台机器但在同一个客户端 M1 上运行相同的测试时,它失败了。所以你看到了我想知道的其他东西。它真的不是页面加载时间,我已经尝试了 20 秒,并且也确实使用了 WebDriverWait,但没有运气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2011-01-15
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多