【问题标题】:Selenium - WebElement.Click(), page refreshes but not loadingSelenium - WebElement.Click(),页面刷新但不加载
【发布时间】:2018-11-01 15:55:09
【问题描述】:

在 Java 中使用 pagefactory 和 selenium 3,我创建了一个简单的脚本来登录和注销。我已使用以下内容进行显式等待:

public void verifyElementisEnabled( WebElement wElement,String sFieldName){     

    printCurrentDate();
    try{

        wait.until(ExpectedConditions.elementToBeClickable(wElement));          
        wait.until(ExpectedConditions.visibilityOf(wElement));
        **//Thread.Sleep("1000") - Script works if this line is uncommented**
        if (wElement.isEnabled()==true)
            System.out.println(sFieldName + " is enabled");
        printCurrentDate();

    }catch (Exception e){

        printCurrentDate();
        System.out.println(sFieldName + " is NOT enabled");                     
        Assert.fail(sFieldName +  " Field not found", e);
    }       
}

我面临的问题是,对于注销,单击 web 元素后,页面会短暂刷新一秒钟,但未显示相应的登录页面,而是停留在同一页面中。在点击之前,我没有看到 weblement 有任何异常。下面是代码sn-p。

但是,如果我在上述“VerifyElementisEnabled”方法中使用 “Thread.Sleep(1000)”,所有这些都有效(任何小于 1000 的方法都不起作用)

@Test
public void Test1(){
    LoginPage objLogin = new LoginPage(driver);
    objLogin.setUserName();
    objLogin.setPwd();
    HomePage objHome = objLogin.clickLoginButton();
    objHome.confirmHomePage();
    objLogin = objHome.SignOut();
    objLogin.verifyLoginPage();
}

public LoginPage SignOut(){
    commonLib.click_webelement(SignOut,"Sign Out");
    commonLib.waitForPagetoLoadJS_Ajax();
    return new LoginPage(driver);
}

等待 JS 和 Ajax 方法,只是验证 document.ready 状态是否完整。

我在这里没有想法,任何建议或帮助将不胜感激。

谢谢!

更新:

public void confirmHomePage(){
    commonLib.verifyElementisEnabled(titleText, "User Search");

}

最终更新: 看起来上面给出的父类 Test1 有问题。执行测试后,webdriver 正在返回上一页“登录”。在这里,我返回了“登录页面”类。这阻碍了页面导航。我更新了 Test1 如下:

public void afcDealerTest1(){
    LoginPage objLogin = new LoginPage(driver);
    objLogin.enterLoginCredentials();
    HomePage objHome = objLogin.clickLoginButton();
    objHome.confirmHomePage();
    objHome.SignOut(); //<-- Refer to this line
    objLogin.verifyLoginPage();
}

还删除了所有方法中的所有 thread.sleep,除了 JS Ready 状态为 Complete 和 200ms 睡眠。它似乎工作正常。

感谢大家的帮助。

【问题讨论】:

  • 请在里面显示调用verifyElementisEnabled()的函数代码。
  • 不要使用 Thread.Sleep(1000)。这不是最佳做法。如果由于某种原因超时更改为 1001 秒,会发生什么?你的测试开始失败,你不知道为什么。您可以使用 while 循环创建自定义等待函数,添加特定于时间范围的条件,并检查每秒的更新。如果达到最大时间,并且元素不可见/未更改,则测试必须失败。
  • @yong,在主帖中添加了方法。
  • @Zhivko.Kostadinov,我同意这就是我评论睡眠命令的原因。我有一个带有 if(wElement.isDisplayed()==true) 的 while 循环,它总是显示为 True。我猜还有一些我想念的东西。
  • @swame,请显示Logout 的HTML,我怀疑它通过绑定到Logout 点击事件的JavaScript 函数实现了登录页面的导航。如果像&lt;a href='/login'那样实现注销,从我经历的案例来看,即使浏览器忙于加载主页,如果您点击主页上的Logout,浏览器仍然可以响应您的点击并最终导航到登录页面。

标签: selenium selenium-webdriver


【解决方案1】:

这是同步问题。似乎元素在一段时间后会绕过您的显式条件而启用。您应该等到元素启用。

【讨论】:

  • 是的,如果你能看到主帖,我正在使用显式等待,没有隐式等待,它也是 element.IsDisplayed 和 wait.until (isclickable) 的条件,仍然没有运气。
  • 我的意思是说你可能没有使用正确的显式等待条件。
  • 不确定还需要什么,点击后我正在等待元素显示并且可见性为真,也直到 javascript 加载完成。
【解决方案2】:

通过以下修改修复它:

之前:

    @Test
public void Test1(){
    LoginPage objLogin = new LoginPage(driver);
    objLogin.setUserName();
    objLogin.setPwd();
    HomePage objHome = objLogin.clickLoginButton();
    objHome.confirmHomePage();
    objLogin = objHome.SignOut();
    objLogin.verifyLoginPage();
}

修复:

@Test
public void Test1(){
    LoginPage objLogin = new LoginPage(driver);
    objLogin.setUserName();
    objLogin.setPwd();
    HomePage objHome = objLogin.clickLoginButton();
    objHome.confirmHomePage();      

objHome.SignOut();

    objLogin.verifyLoginPage();
}

【讨论】:

    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2023-03-11
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多