【问题标题】:Unable to locate Xpath Element无法找到 Xpath 元素
【发布时间】:2020-06-14 19:08:04
【问题描述】:

嗨,我对 selenium 还很陌生。有人可以建议如何在 iframe 中定位和元素,因为下面出现错误。

我正在尝试在 Salesforce Pardot 页面上实施自动化脚本,并且有 2 个 iframe,我想访问第一个 iframe 标记上的按钮并单击相同。

错误:- selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素: {"method":"xpath","selector":"//*[starts-with(@class,'slds-button_reset')]"} (会话信息:chrome=80.0.3987.122)

Screenshot for DOM Button Element

Screenshot for DOM Button Element along with Iframe tag

以前编写的代码

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()

【问题讨论】:

  • 请添加您目前尝试过的代码。
  • @Vipul_21 这次我将还原更改。如果您的要求发生了变化,请随时根据您的新要求提出新问题。 Stackoverflow 志愿者很乐意为您提供帮助。

标签: python selenium selenium-webdriver dom xpath


【解决方案1】:

试试这个: //li[@id='ember943']

【讨论】:

  • 它将抛出错误,因为定位器无法定位 Xpath 元素--> //li[@id='ember943']
【解决方案2】:

您需要先获取 iframe 标签,然后将驱动程序切换到它,如下所示。

driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) 假设驱动程序是一个健康的 webdriver 实例。要继续使用默认内容,请执行 driver.switch_to.default_content()

请参考this link

【讨论】:

    【解决方案3】:

    我希望您切换到正确的 iframe 以获取元素...请参阅下面的示例

    driver.switchTo().frame("content-frame")
    driver.findElement(By.xpath("//div[@id='ember740']/div[2]/div/ol/li/div/button")
    driver.switchTo().defaultContent()
    

    【讨论】:

    • Getting Error Str object is Not callable.
    【解决方案4】:

    由于所需元素位于 <iframe> 内,因此要在元素上调用 click(),您必须:

    • 为所需的frame_to_be_available_and_switch_to_it() 诱导 WebDriverWait
    • 为所需的element_to_be_clickable() 诱导 WebDriverWait
    • 您可以使用以下任一Locator Strategies

      • 使用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
      

    参考

    您可以在以下位置找到一些相关讨论:

    【讨论】:

    • 嗨@Debanjan B 感谢您的回复,按钮被点击但我需要将 span 元素的值更改为 This Month。我尝试添加以下代码行但没有运气。 WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element_value(text_='This Month',locator=(By.CSS_SELECTOR,"span[data-qa='reporting-filter-trigger-value']")))
    • 对于来自 DOM 元素的 SS 以及单击按钮时出现的下拉列表请参阅上面我刚刚添加的问题帖子。
    • @Vipul_21 这应该是一个单独的问题。你能根据你的新要求提出一个新问题吗?
    • 您能否检查一下这篇文章,因为我已经发布了相同的单独问题。 stackoverflow.com/questions/60501908/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 2019-11-19
    • 2020-04-09
    相关资源
    最近更新 更多