Невозможно найти элемент Xpath - PullRequest
1 голос
/ 02 марта 2020

Привет, я довольно новичок в селене. Может кто-нибудь подсказать, пожалуйста, как найти и вставить в iframe asi ошибку ниже.

Я пытаюсь реализовать скрипт автоматизации на странице Salesforce Pardot, и есть 2 кадра и я хочу получить доступ к кнопке на первом теге iframe и нажать на нее.

Ошибка: - selenium.common.exceptions.NoSuchElementException: Сообщение: нет такого элемента: невозможно найти элемент: {"method": "xpath", "selector": "// * [начинается с (@ class, 'slds-button_reset')]"} (информация о сеансе: chrome = 80.0.3987.122)

Снимок экрана для элемента кнопки DOM

Снимок экрана для элемента кнопки DOM вместе с тегом Iframe

Код, написанный ранее

from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
prefs = {'download.default_directory': r'C:\Pardot'}
chrome_options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(executable_path="D:\XXX XXXX\XXXX\drivers\chromedriver.exe", options=chrome_options)
driver.get('https://pi.pardot.com/engagementStudio/studio#/15627/reporting')
user_name = driver.find_element_by_css_selector('#email_address')
user_name.send_keys('XXXXXXXXXXXXXXXXXXX')
password = driver.find_element_by_css_selector('#password')
password.send_keys('XXXXXXXXXXXXXXXXX)
submit_button = driver.find_element_by_css_selector('input.btn')
submit_button.click()
iframe_list =  driver.find_elements_by_tag_name("iframe")
driver.switch_to.frame(iframe_list[0])
driver.find_element_by_xpath("//*[starts-with(@class,'slds-button_reset')]")
driver.close()

Ответы [ 4 ]

3 голосов
/ 02 марта 2020

Сначала нужно получить тег iframe и переключить драйвер на него следующим образом.

driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) при условии, что драйвер является работоспособным экземпляром веб-драйвера. Чтобы продолжить работу с содержимым по умолчанию, выполните driver.switch_to.default_content()

Пожалуйста, обратитесь по этой ссылке

1 голос
/ 02 марта 2020

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

  • Ввести 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#content-frame")))
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-qa='reporting-filter-trigger-toggle'][data-ember-action]"))).click()
      
    • Использование XPATH:

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='content-frame']")))
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//button[@data-qa='reporting-filter-trigger-toggle' and @data-ember-action]"))).click()
      
  • Примечание : необходимо добавить следующие операции импорта:

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

Ссылка

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

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

Я надеюсь, что вы переключаетесь на правильный Iframe для получения элемента ... Пожалуйста, посмотрите пример ниже

driver.switchTo().frame("content-frame")
driver.findElement(By.xpath("//div[@id='ember740']/div[2]/div/ol/li/div/button")
driver.switchTo().defaultContent()
0 голосов
/ 02 марта 2020

Попробуйте это: // li [@ id = 'ember943']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...