当前位置: 首页 > 面试题库 >

在seleniumweb驱动程序中如何选择正确的iframe

谢和同
2023-03-14
问题内容

我试图单击此页面上的元素:

url = 'https://finance.yahoo.com/quote/GOOG?ltr=1'
driver = webdriver.Firefox()
driver.get(url)
driver.find_element_by_link_text('Financials')

在这一点上,我想单击“现金流量”,“资产负债表”或“季度”。我知道这些按钮已加载,因为我可以使用BeautifulSoup从页面源中提取它们。但是,当我尝试使用Selenium时:

driver.find_element_by_link_text('Cash Flow')
driver.find_element_by_link_text('Balance Sheet')
driver.find_element_by_link_text('Quarterly')

全部返回“无法定位元素”,除了“季度”返回一个元素,但它位于图上方的一个元素而不是我感兴趣的表格上方的一个元素。

我认为这是由于位于错误的iframe中,而我找到了所有iframe:

driver.find_elements_by_tag_name('iframe')

返回9个元素。但是我在确定要单击的元素属于哪个iframe时遇到了麻烦。我也按顺序浏览了iframe,但仍然找不到我感兴趣的元素。


问题答案:

我刚刚在网站上签到,它们(您要查找的元素) 不在 任何 iframe 代码中。

以下代码对我有用(更改为xpath,无需切换):

driver.find_element_by_xpath("//span[contains(text(),'Cash Flow')]").click()
driver.find_element_by_xpath("//span[contains(text(),'Balance Sheet')]").click()
driver.find_element_by_xpath("//span[contains(text(),'Quarterly')]").click()

注意:
可能是对于“财务”而言,父标签是a链接的原因,而对于其他元素(现金流,资产负债表),父标签div不是链接的原因。因此find_element_by_link_text可能无法正常工作。

在iframe之间切换:

您必须先切换到存在该元素的框架,然后才能尝试对其进行识别。

假设您的元素位于3个iframe中,如下所示:

<iframe name="frame1">
  <iframe name="frame2">
     <iframe name="frame3">
        <span>CashFlow</span> <! Span element is inside of 3 iframes>
    </iframe>
    <span>balance sheet> <! Span element is inside of 2 iframes>
  </iframe>
</iframe>

现在,如果您要标识三个iFrame中的CashFlow:

    driver.switch_to_frame(driver.find_element_by_name("frame1")) // here, you can provide WebElement representing the iFrame or the index.
    driver.switch_to_frame(driver.find_element_by_name("frame2"))
    driver.switch_to_frame(driver.find_element_by_name("frame3"))
    driver.find_element_by_link_text("CachFlow")

    # switch to default frame before you again try find some other element which is not in the same frame (frame3)

   driver.switch_to_default_content()

   # then navigate to the frame that you want to indentify the element:
   driver.switch_to_frame(driver.find_element_by_name("frame1")) 
   driver.switch_to_frame(driver.find_element_by_name("frame2"))
   driver.find_element_by_link_text("balance sheet")

  # switch to default content again
  driver.switch_to_default_content()

注意:
正如您提到的那样,我使用帧参考而不是索引,因为有9个iFrame。因此,使用索引会造成混乱。如果您无法识别frameElement,则仅查找索引。

参考:

  1. http://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.switch_to_frame


 类似资料:
  • 下拉列表的超文本标记语言代码 通过单击spans下拉列表将显示。下拉值在li内 如何选择li中提到的选项。我们只有span ID。

  • 我们如何使用Testng在硒网络驱动程序中选择下拉值?

  • 对于以下元素,如何使用css选择器通过td的值找到它?在这种情况下,它是“唯一文本”

  • 问题内容: 我看到几乎每个人都在这里使用该语句,我们创建了一个类型为as 的类的实例。如果我直接创建了FirefoxDriver的实例,那又 经过很多讨论,据说Webdriver是一个接口,该怎么办?我知道什么是接口以及它如何工作。当我知道Firefox是我要在硒脚本中使用的唯一浏览器时,我想知道是否 正确? 问题答案: 正如您在问题中提到的那样,您 知道 Firefox 是您将在Selenium

  • 我有以下selenium脚本,等待页面加载并查找元素。在检索到元素之后,我想关闭驱动程序,这样我的ram就会被释放,但是整个程序以结束,这意味着驱动程序在不适当的时间被关闭。我如何正确关闭我的驱动程序后,我想要的信息?

  • 问题内容: 我正在使用Selenium chromewebdriver 3.7自动化测试。每当我浏览该网站时,都会出现如下所示的证书选择弹出窗口 但是,我无法单击“确定”按钮。这些是我 尝试过的选择 我所有的尝试都失败了。如何在此弹出窗口上单击“确定”?这是最接近的解决方案,我发现这是不工作的链接 在这里Linkhere 问题答案: 我遇到了同样的问题,我能够通过使用机器人,为url 创建函数并将