Selenium-WebElement.Click(),页面刷新但不加载

Selenium-WebElement.Click(),页面刷新但不加载,selenium,selenium-webdriver,Selenium,Selenium Webdriver,使用pagefactory和selenium 3与Java,我创建了一个简单的登录和注销脚本。我已使用以下方法进行显式等待: public void verifyElementisEnabled( WebElement wElement,String sFieldName){ printCurrentDate(); try{ wait.until(ExpectedConditions.elementToBeClickable(wElement));

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

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);
    }       
}
我面临的问题是,对于注销,在webelement单击之后,页面会短暂刷新一秒钟,但不会显示相应的登录页面,而是保持在同一页面中。在单击之前,我看不到WebElement有任何异常。下面是代码片段

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

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

我这里没有主意,任何建议或帮助都将不胜感激

谢谢

更新:

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

}
最后更新: 看起来上面给出的父类Test1有问题。执行测试后,webdriver返回到上一个页面“Login”。我返回的是“Login page”类。这妨碍了页面导航。我更新了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();
}
public void afcDealerTest1(){
LoginPage objLogin=新的LoginPage(驱动程序);
objLogin.enterLoginCredentials();
主页objHome=objLogin.clickLoginButton();
objHome.confirmHomePage();

objHome.SignOut();//这是一个同步问题。元素似乎在一段时间后被启用,这绕过了您的显式条件。您应该等待元素被启用。

通过以下修改修复了它:

之前:

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

objHome.SignOut()


请显示将在内部调用的函数代码
verifyElementisEnabled()
。不要使用Thread.Sleep(1000)。这不是最佳做法。如果由于某种原因,超时更改为1001s,会发生什么情况?您的测试开始失败,您不知道原因。您可以使用while循环创建自定义等待函数,添加特定于时间范围的条件,并在每秒钟检查更新。如果达到最大时间,并且元素不可见/更改,则测试失败必须失败。@yong,在主帖子中添加了该方法。@Zhivko.Kostadinov,我同意这就是我评论sleep命令的原因。我与if(welment.isDisplayed()==true)进行了while循环它总是被证明是真的。我想我还遗漏了一些东西。@swame,请显示
注销
的HTML,我怀疑它通过绑定到
注销
点击事件的JavaScript函数实现了登录页面的导航。如果像
一样注销,是的,如果你能看到主帖子,我使用的是explicit wait,不存在隐式等待,它还为element.IsDisplayed和wait.until(isclickable)设置条件,仍然不走运。我的意思是,您可能没有使用正确的显式等待条件。不确定还需要什么,单击后,我将等待元素显示,可见性为真,以及javascript加载完成。
    @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();      
    objLogin.verifyLoginPage();
}