python - Python - 如何使用 selenium 从消失的下拉列表中查找元素
问题描述
我正在尝试使用selenium从Steam 主页上消失的下拉菜单中找到一个元素。当您在搜索栏中输入内容时,结果将下拉,如果您在其外部单击,则下拉结果将消失。如果要再次显示结果,则需要再次单击它。
无论如何,我的代码在搜索栏中输入了一个输入,并且下拉菜单会在运行时显示input_elem.send_keys(game)
(我使用“terraria”作为输入),并且每个第一个结果都有相同的 css 选择器。我还尝试使用 xpath 查找元素,它也不起作用:
from selenium import webdriver
game = input('Type the game you want to find here: ')
# configure browser
browser = webdriver.Firefox()
browser.get('https://store.steampowered.com/')
# input game
input_elem = browser.find_element_by_css_selector('#store_nav_search_term')
input_elem.send_keys(game)
# click the first result
first_match = browser.find_element_by_css_selector('a.match:nth-child(1)')
first_match.click()
这是完整的错误:
Traceback (most recent call last):
File "/home/fanjin/Documents/Python Projects/web_projects/steam/game_finder.py", line 14, in <module>
first_match = browser.find_element_by_css_selector('a.match:nth-child(1)')
File "/home/fanjin/.local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 598, in find_element_by_css_selector
return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
File "/home/fanjin/.local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 976, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "/home/fanjin/.local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/home/fanjin/.local/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: a.match:nth-child(1)
解决方案
要单击第一个自动建议,您必须诱导WebDriverWait并且element_to_be_clickable()
您可以使用以下任一Locator Strategies:
使用
CSS_SELECTOR
:driver.get("https://store.steampowered.com/") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#store_nav_search_term"))).send_keys("terraria") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#search_suggestion_contents>a"))).click()
使用
XPATH
:driver.get("https://store.steampowered.com/") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='store_nav_search_term']"))).send_keys("terraria") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='search_suggestion_contents']/a"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
浏览器快照:
参考
您可以在以下位置找到一些关于NoSuchElementException的相关讨论:
推荐阅读
- javascript - 创建包含图像表格的 PDF 的最简单方法是什么?(HTML/JS)
- arrays - 使用数组中的内容按下按钮时更改标签文本
- javascript - 有没有办法使用javascript向每个表行添加一个
- javascript - 使用 jinja2 仅渲染 HTML
- php - 通过比较时间设置每日限制()
- ios - 刷新后保持表格单元格删除而不触及数据库中的帖子
- algorithm - 是否可以从 (a,b) 移动到 (c,d)
- android - 获取 METHOD GET JSON 改造的问题
- microsoft-graph-api - /security/alerts 未从 Azure 身份保护 (IPC) 返回
- docker - 当我在 dockerfile 中公开一个端口并且它成功构建但在服务器中没有响应时