InvalidSelectorException:消息:无效的选择器:指定了无效或非法的选择器错误点击 div ng-click element with Selenium

InvalidSelectorException: Message: invalid selector: An invalid or illegal selector was specified error clicking on div ng-click element with Selenium

我正在尝试 select

<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: Message: invalid selector: An invalid or illegal selector was specified

感谢任何指导,已经用谷歌搜索了 "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>

尝试使用 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()

Explicit Waits

这个错误信息...

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

...表示您使用的选择器不是有效的选择器表达式。


分析

根据您的第一次代码试验:

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

() 中使用时有特殊效果。所以表达式无效。您需要对字符进行转义。


解决方案

因为所需的元素是 Angular element you need to use for the element_to_be_clickable() and you can use either of the following :

  • 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()