console.log ("текст"), когда нет элемента кнопки, доступного с использованием селена в javascript - PullRequest
1 голос
/ 17 апреля 2020

Я хочу console.log("No element"), когда нет доступного элемента кнопки, но он не работает.

const {Builder, By} = require("selenium-webdriver");

let driver = new Builder().forBrowser("chrome").build();

async function myfun(){

    await driver.get("website")
    await driver.findElement(By.linkText("yes")).click();
    await driver.findElement(By.linkText("yes")).click();
    await driver.sleep(500);
    await driver.findElement(By.id("inputfield")).sendKeys("name");

    setInterval(function(err){
        if (err){
            console.log("No element");
        }else{
            driver.findElement(By.tagName("button")).click();
        }
    }, 1000);

}
myfun()

Я получаю следующие ошибки:

(node:16248) UnhandledPromiseRejectionWarning: NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"button"}
  (Session info: chrome=81.0.4044.92)
(node:16248) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:16248) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

У меня есть также попробовал метод try / cath, но безуспешно.

try {
    driver.findElement(By.tagName("button")).click();
} catch(err) {
    console.log("No element")
}

1 Ответ

0 голосов
/ 18 апреля 2020

Кредит пользователю Артур Веборг . Я нашел этот пост, который решил мою проблему отлично. Он скопирован из другого потока. Для более ясного понимания см. Полный поток здесь .

Выбранный ответ не сработал, как ожидалось (err.state было undefined, а NoSuchElementError всегда выбрасывалось) - хотя концепция использования необязательных обратных вызовов все еще работает.

Поскольку я получаю ту же ошибку, на которую ссылается OP, я считаю, что на NoSuchElementError следует ссылаться при определении, существует ли целевой элемент или нет. Как следует из названия, это ошибка, которая выдается, когда элемент не существует. Таким образом, условие в errorCallback должно быть:

err instanceof webdriver.error.NoSuchElementError

Таким образом, полный кодовый блок будет выглядеть следующим образом (я также использую async / await для тех, кто использует преимущества этот синтаксис):

var existed = await driver.findElement(webdriver.By.id('test')).then(function() {
    return true;//it existed
}, function(err) {
    if (err instanceof webdriver.error.NoSuchElementError) {
        return false;//it was not found
    } else {
        webdriver.promise.rejected(err);
    }
});
//handle value of existed appropriately here

...