NoSuchElementException: Сообщение: нет такого элемента: невозможно найти элемент при попытке найти элемент внутри iframe - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь автоматизировать сеанс Google Chrome в Python с помощью Selenium. До сих пор я использовал расширение для получения xpath, которое работает нормально. Но теперь при использовании xpath я обнаружил ошибку:

NoSuchElementException: Сообщение: такого элемента нет: Невозможно найти элемент: {"method": "xpath", "selector": "// * [@ id =" ok "]"} (Информация о сеансе: хром = 71.0.3578.98) (Информация о драйвере: chromedriver = 2.45.615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387), платформа = Windows NT 6.3.9600 x86_64)

Строка, которая возвращает ошибку, выглядит следующим образом:

browser.find_element_by_xpath('//*[@id="ok"]').click()

К сожалению, кнопка, которую мне нужно нажать, довольно глубоко находится на веб-странице и требует определенного плагина, который затрудняет вам копирование потока моей программы. Поэтому я загрузил изображение исходного кода веб-страницы (синяя линия - кнопка, которую я хотел бы нажать):

enter image description here

Не могли бы вы дать некоторую помощь о том, как исправить селектор селена, чтобы я мог щелкнуть по элементу?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вам нужно будет переключиться на iframe, прежде чем взаимодействовать с элементами внутри него:

iframe = driver.find_element_by_id("codefile_iframe")    
driver.switch_to.frame(iframe)

А затем продолжите ожидание и нажмите.

0 голосов
/ 14 января 2019

К click() на желаемом элементе, так как нужный элемент находится в пределах <iframe>, поэтому необходимо:

  • Индуцируйте WebDriverWait для желаемого кадра, который будет доступен, и переключитесь на него .
  • Индуцировать WebDriverWait для желаемого элемента, который можно нажимать .
  • Вы можете использовать следующее решение:

    • Блок кода (с использованием CSS_SELECTOR):

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.common.by import By
      
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#codefile_iframe")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#ok[value='OK'][onclick^='loginui']"))).click()
      
    • Кодовый блок (с использованием XPATH):

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.common.by import By
      
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='codefile_iframe']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='ok' and @value='OK'][starts-with(@onclick,'loginui')]"))).click()
      

Здесь вы можете найти соответствующее обсуждение Способы работы с #document в iframe

...