InvalidSelectorException: сообщение: недопустимый селектор: был указан недопустимый или недопустимый селектор, ошибка при нажатии на элемент div ng-click с помощью Selenium - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь выбрать

<div ng-click="select('expert')" class="select-exp__item select-exp__item_active" ng-class="{'select-exp__item_active': 'expert'===selected}" style="">

Я пробовал несколько вещей

driver.find_element_by_css_selector("div[ng-click='select('expert')']").click()

driver.find_element_by_class_name('select-exp__item-title').click()

WebDriverWait(driver, 10).until(EC.element_to_be_clickable(By.XPATH("//div[@class='select-exp__item select-exp__item_active']").click()

WebDriverWait(driver, 10).until(EC.element_to_be_clickable(By.XPATH("//div[@class='select-exp__item select-exp__item_active' and contains(@ng-click, 'select('expert')')]").click()

... но каждый раз получаю одну и ту же ошибку:

InvalidSelectorException: Сообщение: недопустимый селектор: Был указан недопустимый или недопустимый селектор

Благодарен за любые указания, без особого успеха погуглил "selenium ng-click" и все еще изучаю Selenium, спасибо .

Вот полный текст HTML:

<div class="agmodal__wrapper agmodal onboarding-wrapper ng-scope agmodal__wrapper--visible" ng-controller="OnboardingController as ctrl" ng-class="{'agmodal__wrapper--visible': ctrl.shown}" tabindex="-1" style="">
    <div class="onboarding">
        <div class="onboarding__body">
            <!-- ngIf: ctrl.onboardingService.step === 1 --><section class="select-exp step ng-scope" ng-if="ctrl.onboardingService.step === 1" style="">
    <div class="select-exp__header step__header">
        <div class="select-exp__title step__title">Welcome to AMZScout PRO Extension</div>
        <div class="select-exp__desc step__desc">
            PRO Extension helps you find the perfect product to sell on Amazon
        </div>
    </div>
    <div class="select-exp__body">
        <div class="select-exp__body-title">
            Select your experience level with Amazon</div>
        <div class="select-exp__body-desc">
            We will adjust the amount of pop up tips and certain parameters based on your experience. You will be able
            to
            change this choice later in the Settings.</div>
        <div class="select-exp__items">
            <div ng-click="select('beginner')" class="select-exp__item" ng-class="{'select-exp__item_active': 'beginner'===selected}">
                <div class="select-exp__item-title">Beginner</div>
                <div class="select-exp__item-desc">If you are new to Amazon research, you’ll see vital parameters that
                    will help you choose a great
                    product quickly. Great for learning.</div>
            </div>
            <div ng-click="select('expert')" class="select-exp__item select-exp__item_active" ng-class="{'select-exp__item_active': 'expert'===selected}" style="">
                <div class="select-exp__item-title">Expert</div>
                <div class="select-exp__item-desc">As an expert, you’ll see the full data and be able to fine-tune your
                    research.</div>
            </div>
        </div>
    </div>

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Это сообщение об ошибке ...

InvalidSelectorException: Message: invalid selector: An invalid or illegal selector was specified

... подразумевает, что используемый вами селектор не является допустимым выражением селектора.


Анализ

Согласно вашей первой пробной версии кода:

driver.find_element_by_css_selector("div[ng-click='select('expert')']").click()

( и ) имеют особый эффект при использовании в . Таким образом, выражение недействительно. Вам нужно экранировать символы.


Решение

Поскольку желаемый элемент - это Angular, вам необходимо использовать WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих Стратегий локатора :

  • CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.select-exp__item.select-exp__item_active[ng-click=\"select('expert')\"]"))).click()
    
  • XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='select-exp__item select-exp__item_active' and @ng-click=\"select('expert')\"]"))).click()
    
1 голос
/ 19 июня 2020

Попробуйте найти элемент с помощью селектора css следующим образом:

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.select-exp__item.select-exp__item_active'))).click()

Вы ошиблись, используя WebdriverWait, ваш код:

WebDriverWait(driver, 10).until(EC.element_to_be_clickable(By("value").click()

Это должно выглядеть так:

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By, 'value'))).click()

Явное ожидание

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...