Javascript 硒事件和等待
我正在与Selenium合作,为我们公司的网站自动化一些测试,但遇到了一些问题Javascript 硒事件和等待,javascript,selenium,Javascript,Selenium,我正在与Selenium合作,为我们公司的网站自动化一些测试,但遇到了一些问题 TestItemFromSearch: (driver, part, qty) => { Search.SearchItem(driver, part); driver.findElement(By.id('enterQty')).findElement(By.tagName('input')).sendKeys(qty); driver.findElement(By.linkText
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。不管我设置了什么条件,它都不会真正找到那个条件——它失败了。我必须劫持Reject方法来执行所需的操作(比如Login.Login)
我可能不得不在同一个测试中再次这样做,因为它将在多个页面中运行。。这将导致难看、难看、不可读的代码
如何让Selenium正确等待?如果我这样做:
driver.wait(()=>{},1000)
它永远不会消失。如果我输入return语句,它会立即失败,甚至不会等待第二秒。在与页面上的元素交互之前,您应该使用selenium驱动程序的
WaitForElementPresent
或WaitForElementVisible
功能。selenium驱动程序将监视DOM并分别验证每个元素的存在或呈现。在这些检查首先通过之后,应该可以安全地与页面交互以进行进一步测试。您需要使用显式(而不是隐式)等待。有多种方法可以做到这一点:
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; };;
也许这有助于它是一个“异步函数()”
那是Java还是JavaScript?我不认为Node.JS Selenium有这些功能?我只是发布了一个显式的等待,应该可以与Node JS一起使用这些是Java元素,而不是Node/JS元素。您好,欢迎来到SO!请让您的答案更清晰易懂。此答案适用于Nodejs用户
driver.wait(function() {
return driver.findElement(locator).isDisplayed();
}, timeout);
var nameButton = By.linkText('Personalize')
await driver.wait(function () {
return until.elementIsVisible(nameButton);
}, 20000).then(() => {console.log("element visible")})
button = await button.findElement(nameButton).then(()=>{ console.log("found element")})
await button.click().then(()=>{ console.log("I clicked the button")})