Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 硒事件和等待_Javascript_Selenium - Fatal编程技术网

Javascript 硒事件和等待

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

我正在与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。不管我设置了什么条件,它都不会真正找到那个条件——它失败了。我必须劫持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")})