如何让硒点击单选按钮

时间:2021-05-24 00:27:43

标签: python css selenium selenium-webdriver xpath

我想在 Python 3.9 中使用 Selenium 来点击按钮。

https://www.sepaq.com/en/reservation/national-parks/annual-card enter image description here

我想点击生效日期并点击 2021 年 7 月,然后点击确定。

前两个工作正常,然后我添加了单击确定按钮的代码,我无法再单击 2021 年 7 月。有趣的是,单击确定步骤也有效。

错误我收到此错误:

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
  (Session info: chrome=90.0.4430.212)

我试过了:

  1. sleep 语句使其等待按钮变为可用
  2. Web 驱动程序等待
  3. 操作链使其滚动到视图中

我使用带有 chrome 的 Selenium IDE 来给我 css 标签。

from time import sleep

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options 
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def print_hi():


    chrome_options = Options()
    chrome_options.add_experimental_option("detach", True)
    chrome_options.add_argument("start-maximized")
    chrome_options.add_argument("disable-infobars")
    chrome_options.add_argument("--disable-extensions")


    annual_pass = webdriver.Chrome(options=chrome_options)
    annual_pass.get("https://www.sepaq.com/en/reservation/national-parks/annual-card")

    type = annual_pass.find_element_by_css_selector('.form-list:nth-child(2) > li:nth-child(1) .form-label')
    type.click()

    annual_pass.get("https://www.sepaq.com/en/reservation/national-parks/annual-card")
    open_eff_date_panel = annual_pass.find_element_by_link_text('Select')
    open_eff_date_panel.click()

    annual_pass.get("https://www.sepaq.com/en/reservation/national-parks/annual-card")
    selectJuly = annual_pass.find_element_by_css_selector('li:nth-child(3) .form-label')
    #selectJuly = annual_pass.find_element_by_xpath('//*[@id="date2"]')
    selectJuly.click() ## error here##

    annual_pass.get("https://www.sepaq.com/en/reservation/national-parks/annual-card")
    ok_button = annual_pass.find_element_by_css_selector('#reserver-date .bouton')
    ok_button.click()

    sleep(10)
    annual_pass.close() 
if __name__ == '__main__':
    print_hi() 

1 个答案:

答案 0 :(得分:0)

Selenium 的点击切换可能不稳定。

首先,试试这个方法:

selectJuly = annual_pass.find_element_by_css_selector('#reserver .panel.is-active>.panel-middle li:nth-child(3) .form-label')
annual_pass.execute_script("arguments[0].click();", selectJuly)
ok_button = annual_pass.find_element_by_css_selector('#reserver-date .bouton')
ok_button.click()

它有效,但我不喜欢窗口没有完全展开。

带有调试信息的完整代码:

import time
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def print_hi():


    chrome_options = Options()
    chrome_options.add_experimental_option("detach", True)
    chrome_options.add_argument("start-maximized")
    chrome_options.add_argument("disable-infobars")
    chrome_options.add_argument("--disable-extensions")


    annual_pass = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver', options=chrome_options)
    annual_pass.get("https://www.sepaq.com/en/reservation/national-parks/annual-card")

    open_eff_date_panel = annual_pass.find_element_by_link_text('Select')
    open_eff_date_panel.click()
    # wait = WebDriverWait(open_eff_date_panel, 10)
    # wait.until(EC.visibility_of_element_located(
    #     (By.CSS_SELECTOR, "//html[@class='js history es5array video opacity csspointerevents placeholder inlinesvg es5date supports es5function es5object strictmode es5string json es5syntax es5undefined es5 no-touchevents cssvhunit mediaqueries vibrate csscolumns csscolumns-width csscolumns-span csscolumns-fill csscolumns-gap csscolumns-rule csscolumns-rulecolor csscolumns-rulestyle csscolumns-rulewidth csscolumns-breakbefore csscolumns-breakafter csscolumns-breakinside flexbox csstransforms csstransforms3d no-ios panel-active']")))
    selectJuly = annual_pass.find_element_by_css_selector(
        '#reserver .panel.is-active>.panel-middle li:nth-child(3) .form-label')
    annual_pass.execute_script("arguments[0].click();", selectJuly)
    ok_button = annual_pass.find_element_by_css_selector('#reserver-date .bouton')
    ok_button.click()

    # annual_pass.close()
if __name__ == '__main__':
    print_hi() 

2 另外,您可以尝试实现自己的函数,以等待表单的某些 css 属性发生更改(例如宽度)。为此,请使用 Selenium 的 value_of_css_property

3 如果您等待所有类在 xpath 中可用,它也可以工作,但看起来并不健壮。您可以将此定位器更改为 css 并一一排除类以使其更短。只等待 panel-active 课是行不通的:

wait = WebDriverWait(open_eff_date_panel, 10)
wait.until(EC.visibility_of_element_located(
    (By.XPATH, "//html[@class='js history es5array video opacity csspointerevents placeholder inlinesvg es5date supports es5function es5object strictmode es5string json es5syntax es5undefined es5 no-touchevents cssvhunit mediaqueries vibrate csscolumns csscolumns-width csscolumns-span csscolumns-fill csscolumns-gap csscolumns-rule csscolumns-rulecolor csscolumns-rulestyle csscolumns-rulewidth csscolumns-breakbefore csscolumns-breakafter csscolumns-breakinside flexbox csstransforms csstransforms3d no-ios panel-active']")))
selectJuly = annual_pass.find_element_by_css_selector('#reserver .panel.is-active>.panel-middle li:nth-child(3) .form-label')
selectJuly.click()

我也试过了,wait.until(lambda driver: driver.execute_script("return jQuery.active == 0")) 但它不适用于这种情况。

我有一个类似的问题:Cannot click on toggle with selenium because of ElementNotInteractableException

相关问题