2015-11-11 92 views
0

我正在与Selenium合作对我们公司网站的一些测试进行自动化,但遇到问题。硒事件和等待

TestItemFromSearch: (driver, part, qty) => { 
    Search.SearchItem(driver, part); 
    driver.findElement(By.id('enterQty')).findElement(By.tagName('input')).sendKeys(qty); 
    driver.findElement(By.linkText('Personalize')).click(); 
    //This directs to a new page. 
    driver.wait(() => { 
    }, 1000).then(() => { 
     }, //TODO: This sucks. Fix it. 
     Login.Login(driver, Logins.username, Logins.password)); 
    driver.findElement(By.className('selectDesignButton')).click(); 
} 

有时候,当Selenium被引导到一个新页面时,我会使用wait。无论我输入什么条件,它都没有真正找到这种条件 - 它失败了。我必须劫持拒绝方法才能进行所需的操作(如Login.Login)。

我可能不得不在相同的测试中再次这样做,因为它要穿过多个页面......这会导致丑陋,丑陋,不可读的代码。

我该如何让Selenium正常等待?如果我做到以下几点:

driver.wait(()=>{},1000) 

它只是坐在永远。如果我提交回复声明,它立即失败,甚至不等第二个。

回答

0

在与页面上的元素进行交互之前,您应该使用硒驱动程序的WaitForElementPresentWaitForElementVisible功能。 selenium驱动程序将观察DOM并分别验证每个元素的存在或呈现。在首先通过这些检查之后,与页面进行交互以进行进一步测试应该是安全的。

+0

这些都是Java元素,而不是节点/ JS元素。 –

0

您需要使用显式(而不是隐式)等待。有多种方法可以做到这一点:

WebDriverWait wait = new WebDriverWait(driver, timeOut); 
wait.until(ExpectedConditions.elementToBeClickable(locator)); 

或者你也可以使用不同的形式明确的等待,这是一个fluentWait:

public WebElement fluentWait(final By locator) { 
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
     .withTimeout(30, TimeUnit.SECONDS) 
     .pollingEvery(5, TimeUnit.SECONDS) 
     .ignoring(NoSuchElementException.class); 

WebElement foo = wait.until(new Function<WebDriver, WebElement>() { 
    public WebElement apply(WebDriver driver) { 
     return driver.findElement(locator); 
    } 
}); return foo; };; 

要么会的工作,我个人更喜欢一个fluentWait因为你可以请指定:

  1. FluentWait必须检查定义的条件的频率。
  2. 忽略在页面上搜索元素时忽略特定类型的异常等待,例如 NoSuchElementExceptions。
  3. 最长时间等待条件

试试这个:

driver.wait(function() { 
    return driver.findElement(locator).isDisplayed(); 
}, timeout); 
+0

是Java还是JavaScript?我不认为Node.JS Selenium具有这些功能? –

+0

我刚刚发布了一个明确的等待,应该与节点JS一起工作 – marchocolate

+0

这不正是我在我自己的代码中使用的? –