Как переключиться на фрейм и выбрать в нем элемент?

Я пытаюсь выбрать фрейм mainFrame.

Источник страницы:

<frameset rows="89,*" frameborder="NO" border="0" framespacing="0">
    <frame name="topFrame" scrolling="NO" noresize src="inc-webpage/b-topnav.asp">
        <frameset rows="*,20" frameborder="NO" border="0" framespacing="0">
            <frameset cols="175,*" frameborder="NO" border="0" framespacing="0">
                <frame name="leftFrame" scrolling="AUTO" noresize src="inc-webpage/b-sidenav-3.asp">
                <frame name="mainFrame" src="b-default.asp">
            </frameset>
            <frame name="bottomFrame" scrolling="NO" noresize src="inc-webpage/b-footer.asp">
        </frameset>
</frameset>
<noframes>

Элемент, который я хочу выбрать, находится в mainFrame. Поэтому мой код:

time.sleep(5)    
driver.switch_to.frame("mainFrame");
driver.find_element_by_xpath("//a[contains(text(),'I Agree')]").click()

да. time.sleep () не идеален, поэтому я пока использую его.

Вот HTML-код элемента, который я хочу выбрать в mainFrame:

<input type="button" value="I Agree" 
class="btn" onmouseover="blueBtnOver(this)" onmouseout="blueBtnOut(this)" 
onclick="javascript:location.href='b-3c-pLessonBooking.asp?limit=pl'" style="background: rgb(0, 102, 204);">

В настоящее время появляется эта ошибка:

NoSuchFrameException (frame_reference) selenium.common.exceptions.NoSuchFrameException: Сообщение: mainFrame

Я абсолютный новичок. driver.find_element_by_xpath, вероятно, ошибается

Также почему на некоторых веб-сайтах используются фреймы // наборы фреймов, в то время как другие используют фреймы, а некоторые не используют ни того, ни другого?


person gabethechef    schedule 25.03.2021    source источник
comment
Кнопка I Agree находится за пределами отправленного вами фрейма. Вам нужно проверить DOM и родительский элемент этой кнопки, есть ли там какой-либо фрейм ?? это должно быть похоже на <frame>#document <html>button element</html></frame>   -  person KunduK    schedule 25.03.2021


Ответы (2)


В основном подождите, пока фрейм переключится на него, а затем щелкните ввод с соответствующим значением. Я согласен.

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

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("mainFrame"))
driver.find_element_by_xpath("//input[@value='I Agree']").click()
person Arundeep Chohan    schedule 25.03.2021
comment
Код возвращает ошибку тайм-аута; он, вероятно, не смог найти рамку - person gabethechef; 25.03.2021
comment
Страница долго загружается? › - person Arundeep Chohan; 26.03.2021
comment
Неа; у меня есть Ethernet-соединение, и я даже установил driver.sleep (30), чтобы убедиться, что - person gabethechef; 26.03.2021

Желаемый элемент вложен в несколько элементов <frame>, поэтому вам необходимо:

  • Вызывайте WebDriverWait для <сильного > родительский фрейм и переключитесь на него.

  • Вызывайте WebDriverWait для <сильного > дочерний фрейм и переключитесь на него.

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

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

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

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='topFrame']")))
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='mainFrame']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.btn[value='I Agree']"))).click()
      
    • Использование XPATH:

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//frame[@name='topFrame']")))
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//frame[@name='mainFrame']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='btn' and @value='I Agree']"))).click()
      
  • Примечание. Вам необходимо добавить следующий импорт:

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

Ссылка

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

person DebanjanB    schedule 29.03.2021