ElementNotVisibleException:消息:试图点击youtube搜索中的顶部视频时出现元素不可交互错误



我似乎找不到点击正确元素的方法来获得我想要的url。本质上,我试图点击youtube搜索中的顶部视频(排名最高的返回视频)。

如何解决ElementNotInteractiableException:元素在Selenium网络驱动程序中不可见?->这是针对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时,它会点击错误的视频。

我已经尝试了所有类型的等待——"显式"one_answers"隐式"——现在都有效了。我很确定我需要执行一些JavaScript,但我不知道如何执行。

你差不多到了。您需要诱导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()
    

这就是你永远不应该使用JavaScript点击的原因之一,Selenium Webdriver的设计是为了刺激,就像真正的用户能够点击一样。真正的用户不能点击页面中的不可见元素,但你可以通过Javascript点击。如果您按idvideo-title搜索元素,它总共匹配53个视频。但我不知道你想点击哪一个。您可以通过其他方式(而不是通过id)匹配该元素。

我会给你一个如何点击该元素的想法,但你需要在点击之前先找到索引。

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

如果第一个是不可见的,那么传递2,[2],然后传递3,计算出它单击所需元素的是哪一个。或者您可以指定确切的元素,我们可以尝试通过其他方式定位该元素。

最新更新