ElementNotVisibleException: сообщение: элемент не взаимодействует ошибка при попытке нажать на верхнем видео в поиске YouTube - PullRequest
0 голосов
/ 10 февраля 2019

Я не могу найти способ нажать на нужный элемент, чтобы получить URL, который я ищу.По сути, я пытаюсь нажать на видео top в поиске на YouTube (наиболее высоко оцененное возвращаемое видео).

Как разрешить ElementNotInteractableException: Элемент не виден в веб-драйвере Selenium? -> Это для Java, но оно позволяет мне двигаться в правильном направлении (зная, что мне нужно выполнить JavaScript)

http://www.teachmeselenium.com/2018/04/17/python-selenium-interacting-with-the-browser-executing-javascript-through-javascriptexecutor/ -> Это показывает мне, как я должен попытаться выполнить JavaScript в Python.

Я также видел множество статей об ожиданиях, но они не решают мою проблему.

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()

Я получаю ошибку ElementNotVisibleException: Message: element not interactable, когда я не выполняю никакой javascript (даже если он действительно работал до того, как стал совсем не устойчивым).Когда я выполняю javascript, он нажимает на неправильное видео.

Я пробовал все типы ожидания «Явный» и «Неявный», теперь это сработало.Я вполне уверен, что мне нужно выполнить JavaScript, но я не знаю, как.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Вы были почти там.Вам нужно вызвать 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()
    
0 голосов
/ 10 февраля 2019

Это одна из причин, по которой вы никогда не должны использовать JavaScript-клик, Selenium Webdriver создан для стимулирования, как если бы реальный пользователь мог кликать.Настоящий пользователь не может щелкнуть невидимый элемент на странице, но вы можете щелкнуть через Javascript.Если вы ищете элемент по этому идентификатору video-title, он соответствует 53 видео.Но я не знаю, на какую из них вы хотите нажать.Вы можете сопоставить этот элемент другим способом (не по id).

Я дам вам представление о том, как щелкнуть по этому элементу, но вам нужно сначала найти индекс, прежде чем щелкнуть.

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

Если первый невидим, затем передайте 2, [2], затем три, выясните, какой из них щелкает по нужному элементу.Или вы можете указать точный элемент, мы можем попытаться найти этот элемент другим способом.

...