Как найти элемент во вложенных iframes, используя Selenium и Python - PullRequest
0 голосов
/ 26 февраля 2020

Попытка найти xpath для тега <nobr> внизу страницы, и это сводит меня с ума. Кадры - вот что усложняет проблему. Может кто-нибудь сказать мне xpath для этого?

Я пытаюсь написать сценарий селена, и я получил:

EC.frame_to_be_available_and_switch_to_it, ((By.NAME, "main"))

После этого ни одна из моих попыток xpath не сработала, чтобы получить содержимое в теге <nobr>, где указано поставщик.

HTML:

html screenshot

Ответы [ 3 ]

0 голосов
/ 27 февраля 2020

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

  • Индуцировать WebDriverWait для прародитель frame_to_be_available_and_switch_to_it().
  • Индуцировать WebDriverWait для прародителя frame_to_be_available_and_switch_to_it().
  • Индуцировать WebDriverWait для родителя frame_to_be_available_and_switch_to_it().
  • Индуцировать WebDriverWait для желаемого element_to_be_clickable().
  • Вы можете использовать следующие решение:

    • Использование CSS_SELECTOR:

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#main[name='main']")))
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[name='marketcenterHome']")))
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#main[name='TabNavigation']")))
      element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.tabSelText>nobr")))
      
    • Использование XPATH:

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='main' and @name='main']")))
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@name='marketcenterHome']")))
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@name='TabNavigation']")))
      element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='tabSelText']/nobr[text()='Suppliers']")))
      
    • Примечание : необходимо добавить следующий импорт:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

Ссылка

Вы можете найти пару соответствующих обсуждений в:

0 голосов
/ 04 марта 2020

Извиняюсь за задержку возвращения с решением, но проблема заключалась в том, что мне нужно было go поднять уровень от заголовка iframe, чтобы попасть в root, а затем я смог go перейти в основную , Простая проблема, но не такая простая, когда вы не слишком много знаете о кадрах в то время. Я ценю всех, кто нашел время, чтобы ответить.

0 голосов
/ 26 февраля 2020

Другой вариант:

//nobr[.='Suppliers']/parent::span

Для набора кадров:

//frameset[@rows='48,*']
...