ElementNotVisibleException:消息:尝试单击 youtube 搜索中的顶部视频时出现元素不可交互错误
Posted
技术标签:
【中文标题】ElementNotVisibleException:消息:尝试单击 youtube 搜索中的顶部视频时出现元素不可交互错误【英文标题】:ElementNotVisibleException: Message: element not interactable error while trying to click on the top video in a youtube search 【发布时间】:2019-07-04 02:08:45 【问题描述】:我似乎无法找到一种方法来单击正确的元素以获取我正在寻找的 url。本质上,我试图点击 youtube 搜索中的 top 视频(排名最高的返回视频)。
How to resolve ElementNotInteractableException: Element is not visible in Selenium webdriver? -> 这是针对 Java 的,但它让我朝着正确的方向前进(知道我需要执行 javascript)
http://www.teachmeselenium.com/2018/04/17/python-selenium-interacting-with-the-browser-executing-javascript-through-javascriptexecutor/ -> 这向我展示了我应该如何尝试在 python 中执行 javascript。
我也看过无数关于等待的文章,但它们并没有解决我的问题。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
wrds = ["Vivaldi four seasons", "The Beatles twist and shout", "50
cent heat"] #Random list of songs
driver = webdriver.Chrome()
for i in wrds:
driver.get("http://www.youtube.com")
elem = driver.find_element_by_id("search")
elem.send_keys(i)
elem.send_keys(Keys.RETURN)
time.sleep(5)
driver.execute_script("arguments[0].click()",driver.find_element_by_id('video-title')) #THIS CLICKS ON WRONG VIDEO
#elem = driver.find_element_by_id("video-title").click() #THIS FAILS
time.sleep(5)
url = driver.current_url
driver.close()
当我不执行任何 javascript 时,我得到一个 ElementNotVisibleException: Message: element not interactable
错误(即使它实际上已经工作了,在它几乎没有鲁棒性之前)。当我执行 javascript 时,它会点击错误的视频。
我已经尝试了所有类型的“显式”和“隐式”等待,现在这确实有效。 我很确定我需要执行一些 JavaScript,但我不知道怎么做。
【问题讨论】:
见:***.com/a/54551477/8179099 这可以给你一个线索,为什么它点击了错误的链接...... 关闭,但这会返回链接的无序列表。我正在尝试单击(或以某种方式检索)top 链接。 【参考方案1】:你快到了。您需要诱导 WebDriverWait 以使 元素可点击,您可以使用以下解决方案:
代码块:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wrds = ["Vivaldi four seasons", "The Beatles twist and shout", "50 cent heat"]
kwrd = ["Vivaldi", "Beatles", "50"]
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\\chromedriver.exe')
for i, j in zip(wrds, kwrd):
driver.get("https://www.youtube.com/")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#search"))).send_keys(i)
driver.find_element_by_css_selector("button.style-scope.ytd-searchbox#search-icon-legacy").click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "h3.title-and-badge.style-scope.ytd-video-renderer a"))).click()
WebDriverWait(driver, 10).until(EC.title_contains(j))
print(driver.current_url)
driver.quit()
【讨论】:
【参考方案2】:这就是你永远不应该使用 JavaScript 点击的原因之一,Selenium Webdriver 旨在刺激真实用户能够点击。真实用户无法点击页面中的不可见元素,但您可以通过 Javascript 进行点击。如果您通过该 ID video-title
搜索元素,它总共匹配 53 个视频。但我不知道你要点击哪个。您可以通过其他方式(不是通过 id)匹配该元素。
我将告诉您如何单击该元素,但您需要在单击之前先找出索引。
driver.find_element_by_xpath("(//*[@id='video-title'])[1]").click
如果第一个不可见,则传递 2、[2] 然后传递 3,找出它正在单击所需元素的哪个元素。或者您可以指定确切的元素,我们可能会尝试通过其他方式定位该元素。
【讨论】:
注意:在 XPath 中[1]
是第一个元素但是如果你使用 links = driver.find_elements_by_id("video-title")
第一个元素将是 links[0]
JFYI
我认为上面的代码可能存在语法错误。 (除了 .click() 如果那是一个 )。注意:我最初的方法没有使用 javascript,但它一直是我目前的方法,因为我的印象是它是我问题的解决方案。 ~~ elem = driver.find_element_by_id("video-title").click() 失败
@Simon 我更正了。你现在可以检查一下。给出 1,2,3,4 直到您看到正确的链接被点击。或者不使用 ID 编写 xpath>
对于driver.find_element_by_id("(//*[@id='video-title'])[1]").click()
我收到此错误:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: "method":"id","selector":"(//*[@id='video-title'])[1]"
对于driver.find_element_by_xpath("//*[@id='video-title'][1]").click()
我收到selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable
感谢大家的帮助顺便说一句,非常感谢。
@Simon 嗨,它的 xpath,而不是 id。现在尝试通过 2。以上是关于ElementNotVisibleException:消息:尝试单击 youtube 搜索中的顶部视频时出现元素不可交互错误的主要内容,如果未能解决你的问题,请参考以下文章