2017-01-16 76 views
0

为什么我的显式等待不起作用?我的'显式等待'不起作用,但'隐式等待'起作用?

  1. 我的隐式等待工程,但我明确的等待似乎没有使用分配的超时?

  2. 例如,如果我将显式超时设置为300秒,它将恢复为隐式超时,或者如果我注释掉隐式超时,它将立即抛出错误/超时异常。

代码中使用:

public class Base_Page extends TestListenerAdapter { 
public @FindBy(css = ".ajax_loader") WebElement ajaxLoadScreen; 
public @FindBy(css = "#preloaderSpinner") WebElement preloadSpinner; 
public WebDriver driver; 
public String packageName; 
public String className; 
public WebDriverWait wait; 
protected JavascriptExecutor jsExecutor; 

public Base_Page(WebDriver driver) throws Exception { 
    this.driver = driver; 

    this.wait = new WebDriverWait(this.driver, 300); 

    this.driver.manage().window().maximize(); 
    this.driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
    this.driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); 

    Properties p = new Properties(); 
    FileInputStream fi = new FileInputStream(Constant.CONFIG_PROPERTIES_DIRECTORY); 
    p.load(fi); 
    this.browser_type = p.getProperty("browser"); 
    this.page_url = p.getProperty("url"); 
} 

public void loadPage() throws Exception { 
    this.driver.get(page_url); 
} 

public void clickMyAccount() { 
    driver.findElement(By.xpath(".//*[@id='account_links']/li[1]/a2")).click(); 
} 

public void clickHelp() { 
    this.driver.findElement(By.xpath(".//*[@id='help_links']/li[1]/a")).click(); 
} 

enter image description here

+0

显示你的代码的文本,但不是像 – Andersson

+0

@Andersson所有你在哪里使用一个明确的等待做 – Gbru

+0

? – Josh

回答

3
  1. 不,这不是分配菲尔的问题。由于乔希发现正确,你有定义在这里明确的等待:

    this.wait = new WebDriverWait(this.driver, 300);

但你实际上并没有使用它。为了使用它,你需要一个多线仅低于你的等待变量(我更喜欢使用布尔,然后再决定根据结果点击或不!):

Boolean elementPresent = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='account_links']/li[1]/a2"))).isDisplayed()); 

现在,你可以继续并评论你的隐含等待。所以基本上,在你运行你的代码之后,你的程序将等待300秒(这太过分了,但你可能有一个特殊的要求!)xpath中表示的元素出现。

Le'ts假设后仅需4秒已通过webElement确实出现。然后它会立即返回TRUE(这很方便,不需要等待整个等待时间)。否则,它将继续轮询,直到完整的300秒过去,然后返回FALSE。所以,你可以操纵从那时起的流动,即:

If(elementPresent==true){ 
//click element 
} 
else{ 
System.out.println("Oops! Couldn't locate element!") 
} 
  • 实际上它不“恢复”(但我知道你怎么想这件事),但它仅仅是使用您的隐含等待作为明确的等待已被定义但未使用!。它在发现了隐含的等待之后没有发现元素后立即抛出异常,完全没有等待执行!
  • 当然是更好地坚持这个等待的方法(可能有参数,xpathLocator和超时),但现在这里是一些代码,这样你就可以验证TI的工作原理:

    public void clickMyAccount() { 
        WebDriver wait = new WebDriverWait(driver, 300); 
    
        Boolean elementPresent = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='account_links']/li[1]/a2"))).isDisplayed()); 
    
    
        If(elementPresent==true){ 
          driver.findElement(By.xpath(".//*[@id='account_links']/li[1]/a2")).click();    
        } 
        else{ 
        System.out.println("Oops! Couldn't locate element!") 
        } 
    

    希望这有助于!

    +0

    再次感谢您的帮助,您认为在同一个项目中同时拥有隐式和显式等待设置是可取的吗? – Gbru

    +0

    嗨菲尔,如果我的回答确实有帮助,请按下向上箭头来提高它。就个人而言,我不认为在你明确的等待(一个取消另一个)之后,你需要隐含的等待。如前所述,您可以创建一个名为waitForElement(String Xpath,int timeOut)的新方法,并根据您的需要传递xpath和时间以等待。这是为了避免打字所有的时间,明确的等待+ wait.until的定义等。 –

    +0

    再次感谢@Xwris Stoixeia – Gbru

    相关问题