javascript中的WebDriver:如何检查元素是否存在?

时间:2014-08-12 14:59:11

标签: javascript selenium webdriver protractor

如何检查硒中是否存在元素?

我试过了:

browser.driver.findElements(by.id('my-id'))

但它似乎不起作用。

5 个答案:

答案 0 :(得分:5)

使用isElementPresent

browser.driver.isElementPresent(by.id('my-id'))

isPresent

element(by.id('my-id')).isPresent()

答案 1 :(得分:1)

问题是寻找不存在的元素会引发异常。你使用findElements是正确的轨道,因为如果它找不到元素就不会抛出错误,你所遇到的问题是留下一个列表,其中包含找到但未进行比较的列表,以确保至少有1个列表中的元素(例如,它找到了一个元素)

public boolean exists(By by){
return !driver.findElements(by).isEmpty(); 
}

是一个函数,如果存在则返回true,否则返回false。从这种方法中可以清楚地看出如何修改它以满足您的需要。

答案 2 :(得分:1)

webdriver.js示例

在此示例中,我等待一个模态存在,因为它的模态逐渐消失

请参阅以下内容: const didModalFadeInExist =等待this.driver.executeScript('返回document.getElementsByClassName(“模式淡入”)');

您可以将这一行代码置于等待中,以等待元素数组> = 1

这样,您可以在检查等待内容之后知道它存在。

我们还可以同时检查不透明度。

元素数组> = 1且opacity ='1'之后。然后退出等待并继续测试

async waitForModalFadeIn() {
        try {
          let isVisible;
          let opacityReturned;
          let isModalFadeInFound;
          const dialog = await this.driver.wait(until.elementLocated(this.baseselector.MODAL_FADE_IN));
          await this.driver.wait(async () => {
            const doesModalFadeInExist = await this.driver.executeScript('return document.getElementsByClassName("modal fade in")');
            isModalFadeInFound = doesModalFadeInExist;
            const bool = await this.isDisplayed(this.baseselector.MODAL_FADE_IN);
            isVisible = bool;
            const opacity = await dialog.getCssValue('opacity');
            opacityReturned = opacity;
            return isVisible === true && isModalFadeInFound.length > 0 && opacity === '1';
          }, 4000);
          return opacityReturned === '1' && isVisible === true && isModalFadeInFound.length > 0;
        } catch (err) {
          console.log(`Function waitForModalFadeIn: Failed to open modal${err}`);
          return null;
        }
      }

示例测试

    it('Trigger "unmetered" modals in the technical spec section', async () => {
        await wHost.visit(page = '/web-hosting');
        const table = await driver.wait(until.elementLocated(wHost.selector.COMPETITOR_TABLE), this.pageLoadTimeOut);
        await driver.executeScript('arguments[0].scrollIntoView()', table);
        const modals = await table.findElements(wHost.selector.UNLIMITED_MODAL);
        for (let i = 0; i < modals.length; i++) {
          await modals[i].click();
          assert.isTrue(await common.waitForModalFadeIn());
          assert.isTrue(await common.closeModal());
        }
      }); 

答案 3 :(得分:1)

这就是您要寻找的,该函数将id作为参数, 如果找到该元素,它将返回状态为true的json对象以及您要查找的元素。

async function ElementExistsID(element){
    return new Promise(async (resolve)=>{
        try{
            let ElementResult=await driver.findElement(webdriver.By.id(element));
            resolve({"element":ElementResult,"status":true});
        }
        catch(error){
            log.warn(error);
            resolve({"status":false});
        }
    })
}

您可以像这样使用它

let ElementIamLookingFor=await ElementExistsID(IDOfTheElement);
if(ElementIamLookingFor.status){
    console.log("Element exists");
}
else{
    throw new Error("Element not found");
}

答案 4 :(得分:0)

经过多次尝试,以下内容对我有用:

function doIfPresent(elementId, doIfPresent, next) {
  var elem = by.id(elementId);
  browser.driver.isElementPresent(elem).then(function (present){
    if (present) {
      doIfPresent(element(elem));
    }
    next();
  });
}

例如

doIfPresent('my-button', function(element){ element.click();}, function(){
  // your code continues here
});

我不知道为什么我们需要在这里使用期货。