Как я могу нажать на кнопку внутри iframe, используя Selenium и Python - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь нажать на кнопку «Администрирование» внутри iframe, но получаю эту ошибку:

selenium.common.exceptions.TimeoutException: Message:

Код Python, который я использую:

main = driver.find_element_by_xpath("//div[@class='main absolute']")
main.click()
driver.switch_to.frame("tab_Welcome")
button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.wah-global-ask-banner-item div.wah-global-ask-banner-item-title.wah-global-ask-banner-item-title-paa")))
button.click()

HTML:

enter image description here

Ответы [ 4 ]

2 голосов
/ 25 сентября 2019

Индуцировать WebDriverWait и frame_to_be_available_and_switch_to_it() Индуцировать WebDriverWait и element_to_be_clickable() и следующие XPATH.

main = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='main absolute']")))
main.click()
WebDriverWait(driver,20).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"frame_Welcome")))
button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='Administration']")))
button.click()
1 голос
/ 25 сентября 2019

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

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

    • CSS_SELECTOR:

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.iframe-content#tab_Welcome")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.wah-global-ask-banner-item-title.wah-global-ask-banner-item-title-paa"))).click()
      
    • XPATH:

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='iframe-content' and @id='tab_Welcome']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='wah-global-ask-banner-item-title wah-global-ask-banner-item-title-paa' and text()='Administration']"))).click()
      
    • Примечание : необходимо добавить следующие операции импорта:

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

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

0 голосов
/ 25 сентября 2019
def find_all_iframes(driver):
    iframes = driver.find_elements_by_xpath("//iframe")
    for index, iframe in enumerate(iframes):
        # Your sweet business logic applied to iframe goes here.
        driver.switch_to.frame(index)
        find_all_iframes(driver)
        driver.switch_to.parent_frame()
0 голосов
/ 25 сентября 2019

Похоже, вы переходите на iframe, используя его идентификатор, но вам нужно переключиться на него по имени.

Так что вместо driver.switch_to.frame("tab_Welcome")

Вы должны попробоватьdriver.switch_to.frame("frame_Welcome")

Надеюсь, это поможет.

...