无法使用 Selenium 和 Python 访问下拉菜单

Posted

技术标签:

【中文标题】无法使用 Selenium 和 Python 访问下拉菜单【英文标题】:Not able to access dropdown menu using Selenium with Python 【发布时间】:2022-01-12 05:56:49 【问题描述】:

我正在尝试使用 Selenium 编写 Python 脚本,以查看是否可以自动执行我创建的示例事件的注册过程。这是活动页面:https://www.tickettailor.com/events/testing4/621753

我可以访问该页面并点击“加入客人名单”按钮:

from selenium import webdriver
driver = webdriver.Chrome('path_to_chromedriver')
driver.get('https://www.tickettailor.com/events/testing4/621753')
button = driver.find_element_by_link_text('Join the guestlist')
button.click()

之后,我需要从 Category1 票的下拉菜单中选择“1”,让 Category2 中的票数保持为 0。之后,我需要输入姓名和电子邮件来确认我的订单。

但是,我根本找不到选择下拉菜单的元素。我试过driver.find_element_by_id,name,xpath,class_name,css_selector,但都没有奏效。我也尝试过使用 select 选项,如下所示: select = Select(driver.find_element_by_id("quantity_2335182"))(quantity_2335182 是 Chrome 中检查元素中选择标签的 id),然后是 select.select_by_value('1')。它不断给出错误,例如:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: "method":"css selector","selector":"[id="quantity_2335182"]"
  (Session info: chrome=96.0.4664.93)

如果我不必像“quantity_2335182”那样指定特定的 id 并且可以根据通用类名、标签或 css_selector 选择下拉列表,我会更喜欢。另外,我只想选择两个下拉菜单中的第一个(仅编辑 Category1 而不是 Category2)。

【问题讨论】:

【参考方案1】:
wait=WebDriverWait(driver, 60)
driver.get('https://www.tickettailor.com/events/testing4/621753')
wait.until(EC.element_to_be_clickable((By.LINK_TEXT,"Join the guestlist"))).click()
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#overlay_window")))
row1=Select(wait.until(EC.presence_of_element_located((By.XPATH,"(//select)[1]"))))
row1.select_by_index(1)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#submit"))).click()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#name"))).send_keys("a")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#email"))).send_keys("a")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#email_confirm"))).send_keys("a")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#submit"))).click()
## do captcha
key=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,".h-captcha"))).get_attribute("data-sitekey")
print(key)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#submit"))).click()

进口:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select

要自动执行此操作,只需单击链接文本,切换到 iframe 覆盖窗口,使用选择导入和按索引选择,然后单击下一步按钮。

【讨论】:

【参考方案2】:

您无法与下拉菜单交互,因为该弹出窗口位于 iframe 中。所以首先你必须切换到 iframe,然后你才能与元素进行交互。

这里,请看它在 iframe 内:

您的代码步骤是:

    点击加入客人名单按钮 切换到 iframe。即driver.switch_to_frame("overlay_window") 根据您的要求与您的元素或下拉菜单交互 完成所有弹出操作后,切换到默认内容,即driver.switch_to.default_content()

【讨论】:

以上是关于无法使用 Selenium 和 Python 访问下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

使用 Selenium webdriver 和 Python 获得完全渲染的 HTML

如何通过 Python 使用 GeckoDriver 和 Firefox 使 Selenium 脚本无法检测?

Python Selenium 无法使用 Selenium 和 Python 在#shadow-root (open) 中通过 xpath 找到元素

Selenium+Python之163邮件发送

如何使用 Selenium 和 Python 选择具有 unselectable="on" 属性的剑道下拉元素

无法在浏览器中单击radio元素(使用Python 3和Selenium)[重复]