Selenium ElementFinder的超时未反映:(xpath、css)

Selenium ElementFinder的超时未反映:(xpath、css),selenium,testing,promise,protractor,Selenium,Testing,Promise,Protractor,团队,我有一个功能,需要定位元素 var EC = protractor.ExpectedConditions; var busyLoaderEC = EC.stalenessOf(busyLoaderElement); var eleClickPresenceEC = EC.presenceOf(eleClickObject); var eleClickableEC = EC.elementToBeClickable(eleClickObject);

团队,我有一个功能,需要定位元素

    var EC = protractor.ExpectedConditions;
    var busyLoaderEC = EC.stalenessOf(busyLoaderElement);
    var eleClickPresenceEC = EC.presenceOf(eleClickObject);
    var eleClickableEC = EC.elementToBeClickable(eleClickObject);

    var deferred = Q.defer();

    try {
        browser.wait(EC.and(busyLoaderEC, eleClickPresenceEC, eleClickableEC),
            config.timeout, constants.errorMessages.conditionTimedOut).then(function () {

                browser.sleep(1000); //Force Delay                    
                commonHelper.highlightElement(eleClickObject);



            }, function (error) {
                commonHelper.writeLog("ClickObject: " + error);
                deferred.reject(["ClickObject: " + error, reportFiller]);
            });
    }
    catch (error) {
        deferred.reject(["ClickObject: Element Not found -" + error, reportFiller]);
    }
当存在一个id元素,并且预期找不到它时,它将等待
配置超时完成,然后返回一个错误,错误消息包含在
常量.errorMessages.conditionTimedOut
中定义的错误消息

但对于CSS或xpath定位器,如果找不到此元素,并且没有超时,它将立即抛出以下错误:

CT-Driver Automation Suite Iteration   Message:
    Failed: No element found using locator: By(xpath, //div[@wj-part='root']//div[@wj-part='cells']//div[4]//span)   Stack:
    NoSuchElementError: No element found using locator: By(xpath, //div[@wj-part='root']//div[@wj-part='cells']//div[4]//span)
        at WebDriverError (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\error.js:27:10)
        at NoSuchElementError (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\error.js:242:10)
        at c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\built\element.js:699:27
        at ManagedPromise.invokeCallback_ (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1379:14)
        at TaskQueue.execute_ (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2913:14)
        at TaskQueue.executeNext_ (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2896:21)
        at c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2775:27
        at c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:639:7
        at process._tickCallback (node.js:369:9)    From: Task: WebDriver.executeScript()
        at Driver.schedule (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver.js:377:17)
        at Driver.executeScript (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver.js:526:16)
        at Browser.to.(anonymous function) [as executeScript] (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\built\browser.js:60:29)
        at Object.highlightElement (c:\Users\*\Documents\projects\*\ct-driver\common\commonHelper.js:409:24)
        at c:\Users\*\Documents\projects\*\ct-driver\services\seleniumService.js:82:34
        at ManagedPromise.invokeCallback_ (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1379:14)
        at TaskQueue.execute_ (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2913:14)
        at TaskQueue.executeNext_ (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2896:21)
        at c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2775:27
        at c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:639:7
    From: Task: Run it("Suite Iteration") in control flow
        at Object.<anonymous> (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\jasminewd2\index.js:81:14)
        at c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\jasminewd2\index.js:18:5
        at ManagedPromise.invokeCallback_ (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1379:14)
        at TaskQueue.execute_ (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2913:14)
        at TaskQueue.executeNext_ (c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2896:21)
        at c:\Users\*\Documents\projects\*\ct-driver\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2775:27     From asynchronous test: 
    Error
        at Suite.<anonymous> (c:\Users\*\Documents\projects\*\ct-driver\app.js:111:3)
        at Object.<anonymous> (c:\Users\*\Documents\projects\*\ct-driver\app.js:65:1)
        at Module._compile (module.js:409:26)
        at Object.Module._extensions..js (module.js:416:10)
        at Module.load (module.js:343:32)
        at Function.Module._load (module.js:300:12)
CT驱动程序自动化套件迭代消息:
失败:使用定位器(xpath,//div[@wj part='root']//div[@wj part='cells']]//div[4]//span)堆栈未找到任何元素:
NoSuchElementError:未找到使用定位器的元素:By(xpath,//div[@wj part='root']//div[@wj part='cells']//div[4]//span)
在WebDriverError(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\error.js:27:10)
在NoSuchElementError(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\error.js:242:10)
在c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\builded\element.js:699:27
在ManagedPromise.invokeCallback(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:1379:14)
在TaskQueue.execute(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:2913:14)
在TaskQueue.executeNext(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:2896:21)
在c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:2775:27
在c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:639:7
在进程中。_tickCallback(node.js:369:9)From:Task:WebDriver.executeScript()
在Driver.schedule(c:\Users\*\Documents\projects\*\ct Driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\webdriver.js:377:17)
在Driver.executeScript(c:\Users\*\Documents\projects\*\ct Driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\webdriver.js:526:16)
在Browser.to.(匿名函数)[as executeScript](c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\builded\Browser.js:60:29)
在Object.highlightElement(c:\Users\*\Documents\projects\*\ct driver\common\commonHelper.js:409:24)
在c:\Users\*\Documents\projects\*\ct driver\services\seleniumService.js:82:34
在ManagedPromise.invokeCallback(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:1379:14)
在TaskQueue.execute(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:2913:14)
在TaskQueue.executeNext(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:2896:21)
在c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:2775:27
在c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:639:7
From:Task:在控制流中运行它(“套件迭代”)
反对。(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\jasminewd2\index.js:81:14)
在c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\jasminewd2\index.js:18:5
在ManagedPromise.invokeCallback(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:1379:14)
在TaskQueue.execute(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:2913:14)
在TaskQueue.executeNext(c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:2896:21)
在c:\Users\*\Documents\projects\*\ct driver\node\u modules\dragrator\node\u modules\selenium webdriver\lib\promise.js:2775:27异步测试:
错误
在套房。(c:\Users\*\Documents\projects\*\ct driver\app.js:111:3)
反对。(c:\Users\*\Documents\projects\*\ct driver\app.js:65:1)
在模块处编译(Module.js:409:26)
在Object.Module.\u extensions..js(Module.js:416:10)
在Module.load(Module.js:343:32)
在Function.Module.\u加载(Module.js:300:12)
这很烦人,因为即使遇到“element\u not\u found”错误,我也希望我的测试用例继续

关于这一点,您能帮我吗?

ExceptedConditions calls ElementFinder.isPresent 调用
ExpectedConditions
时,似乎
stalenessOf
调用了
presenceOf
presenceOf
调用
ElementFinder.isPresent
方法,如果查看:

您正在立即解决控制流上的这些承诺。这意味着当您调用
browser.wait
时,它们应该会失败,因为不允许
config.timeout
的等待时间让这些元素出现在屏幕上,而不是出现在屏幕上,或者被选中可单击

因此,我们应该做的是:

browser.wait(EC.and(EC.stalenessOf(busyLoaderElement),
    EC.presenceOf(eleClickObject),
    EC.elementToBeClickable(eleClickObject)),
    config.timeout, constants.errorMessages.conditionTimedOut).then(() => {

哪一行抛出错误?完全理解您的意思,但奇怪的是,如果我试图查找的元素是“ID”,那么它将等待超时,而不是“xpath”或“css”。这是一种非常奇怪的行为。如果你接受了我的建议,但仍然找不到自己的价值,那么你的
xpath
搜索可能是不正确的。如果您使用的是最新的量角器,则可以发送命令
dragrator conf.js--highlightDelay
var busyLoaderEC = EC.stalenessOf(busyLoaderElement);
var eleClickPresenceEC = EC.presenceOf(eleClickObject);
var eleClickableEC = EC.elementToBeClickable(eleClickObject);
browser.wait(EC.and(EC.stalenessOf(busyLoaderElement),
    EC.presenceOf(eleClickObject),
    EC.elementToBeClickable(eleClickObject)),
    config.timeout, constants.errorMessages.conditionTimedOut).then(() => {