Объект WebDriver’ не имеет атрибута ‘switch_to_frame’

#python #selenium #selenium-webdriver #iframe #frame

#питон #селен #селен-веб-драйвер #фрейм #рамка

Вопрос:

Я не могу переключиться на успешно идентифицированный iFrame(ы). Сценарий идентифицирует iFrame (проверено в отладчике), но переключение на iFrame завершается ошибкой и попадает в ловушку исключений. Несколько раз назад это работало идеально.

 Message='WebDriver' object has no attribute 'switch_to_frame'  

Что произошло за это время?

Chromedriver был обновлен с версии 95.0.4638.17 до ChromeDriver 96.0.4664.45

Неужели Chromedriver больше не совместим с последней версией Selenium?

 ...  driver.switch_to.default_content()  try:  # find the frame  wait.until(EC.element_to_be_clickable((By.ID, "wysiwygTextarea_ifr")))  frame2 = driver.find_element(By.XPATH, "//iframe[@id='wysiwygTextarea_ifr']");    # switch to frame  driver.switch_to.frame(frame2.tag_name);   print("--------------iframe found-------------------");  except:  print("--------------iframe not found-------------------");  ...  

Комментарии:

1. Еще раз, как я помню, Селен также спонсировал обновление.

2. Еще раз я могу добавить здесь. Сегодня я смог выяснить, почему он работал, как предлагал Дебанджанб, и в следующий раз он больше не работал. Поскольку я понизил рейтинг среды разработки с Selenium 4.x до 3.x, все сценарии теперь работают идеально.

3. Или обновите Selenium только с помощью pip install -U selenium и НЕ устанавливайте новый селен сверху, это подразумевает смесь селена. ПРОБЛЕМА РЕШЕНА!!!

Ответ №1:

При переключении на кадр поддерживаемые обозначения:

  • Переключитесь на кадр, используя имя кадра:
     driver.switch_to.frame('frame_name')  
  • Переключитесь на кадр, используя индекс кадра:
     driver.switch_to.frame(1)  
  • Переключитесь на кадр с помощью элемента кадра:
     driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])  
    • Переключитесь на родительский кадр:

      driver.switch_to.parent_frame()

  • Переключитесь на содержимое по умолчанию:
     driver.switch_to.default_content()  

Это использование

Чтобы переключить кадр, который вы использовали:

 driver.switch_to.frame(frame2.tag_name);  

то есть то, TAG_NAME что не поддерживается. Следовательно, вы видите ошибку:

 Message='WebDriver' object has no attribute 'switch_to_frame'  

Решение

Вы можете использовать следующую строку кода:

 # find the frame wait.until(EC.element_to_be_clickable((By.ID, "wysiwygTextarea_ifr"))) frame2 = driver.find_element(By.XPATH, "//iframe[@id='wysiwygTextarea_ifr']");   # switch to frame by frame element driver.switch_to.frame(frame2);  

Комментарии:

1. Что ж, это исправило мою проблему, хотя ранее я также использовал только «фрейм2» (вероятно, опечатка осталась нераскрытой). В любом случае, спасибо тебе, приятель, за твою поддержку в этом вопросе.