NoSuchElementError: нет такого элемента: невозможно найти элемент при попытке найти элемент через WebdriverJS - PullRequest
0 голосов
/ 14 мая 2018

Я использовал css для поиска элемента, я пытался избежать xpath на всякий случай, но у меня возникли проблемы с элементом. Я все еще получаю сообщение об ошибке:

(node:7516) UnhandledPromiseRejectionWarning: NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"[name-firstName]"}

Это работает только на xpath, но я хочу использовать локатор CSS. Это хорошая практика, чтобы избежать xpath при поиске элемента? спасибо, ребята!

Вот весь элемент:

<input type="text" class="f w-input ng-pristine ng-invalid ng-invalid-required ng-touched" name="firstName" required="" ng-readonly="vm.showLoading" ng-model="vm.formData.firstName" placeholder="Your First Name">

Вот пробный код:

driver.get("www.examplewebsiteonly.com")
    .then(function() {
        return driver.wait(until.elementLocated(By.css('[name=firstName]')), 20000)
        .then(function(){
            driver.sleep(20000)
            .then(function(){
                        return driver.findElement(By.css('[name-firstName]')).sendKeys("FirstName");
                    })
        })
    })

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Если у вас есть атрибут name, вы можете использовать

driver.get("www.examplewebsiteonly.com")
    .then(function() {
        return driver.wait(until.elementLocated(By.name("firstName")), 20000)
        .then(function(){
            driver.sleep(20000)
            .then(function(){
                        return driver.findElement(By.name("firstName")).sendKeys("FirstName");
                    })
        })
    })

Я заменил селектор css на селектор name, который предоставляет Selenium. Также убраны одинарные кавычки для добавления двойных кавычек.

0 голосов
/ 14 мая 2018

В соответствии с HTML, которым вы поделились, чтобы определить желаемый элемент, вы можете использовать любой из следующих Стратегий локатора :

  • css:

    return driver.wait(until.elementLocated(By.css("input.f.w-input.ng-pristine.ng-invalid.ng-invalid-required.ng-touched[name='firstName'][placeholder='Your First Name']")), 20000)
    
  • xpath:

    return driver.wait(until.elementLocated(By.xpath("//input[@class='f w-input ng-pristine ng-invalid ng-invalid-required ng-touched' and @name='firstName'][@ng-model=\"vm.formData.firstName\"]")), 20000)
    
0 голосов
/ 14 мая 2018

Вы не используете один и тот же селектор CSS в обоих случаях. Изменение

[name-firstName]

до

[name='firstName']

во втором экземпляре.

Кроме того, ваш код выглядит слишком сложным. Вы пробовали что-то вроде это ?

...