ElementNotVisibleException:消息:尝试在YouTube搜索中单击顶部视频时元素不可交互错误

时间:2019-02-10 11:46:07

标签: python-3.x selenium selenium-webdriver youtube webdriverwait

我似乎无法找到一种方法来单击正确的元素以获得所需的网址。从本质上讲,我试图在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,但我不知道如何。

2 个答案:

答案 0 :(得分:1)

这是您不应该使用JavaScript单击的原因之一,Selenium Webdriver旨在激发真实用户可以单击的感觉。实际用户无法单击页面中的不可见元素,但可以单击Javascript。如果您通过ID video-title搜索该元素,则它总共匹配53个视频。但我不知道您要单击哪个。您可以通过其他方式(而不是ID)匹配该元素。

我将为您提供一个如何单击该元素的想法,但是您需要在单击之前首先找到索引。

driver.find_element_by_xpath("(//*[@id='video-title'])[1]").click

如果第一个不可见,则传递2 [2],然后传递3,找出正在单击哪个元素。或者您可以指定确切的元素,我们可以尝试通过其他方式找到该元素。

答案 1 :(得分: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()