在seleniumweb驱动程序如何select正确的iframe
我试图点击此页面上的一个元素:
url = 'https://finance.yahoo.com/quote/GOOG?ltr=1' driver = webdriver.Firefox() driver.get(url) driver.find_element_by_link_text('Financials')
在这一点上,我想点击“现金stream量”,“资产负债表”或“季度”。 我知道这些button已经加载,因为我可以从页面源使用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')
所有返回“无法定位元素”,除了“季度”,它返回的是一个元素,但是它坐在graphics上方,而不是我感兴趣的表格之上。
我认为这是由于在错误的iframe,我已经find所有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()
注意:这可能是“财务”的原因,父母标记是代表一个链接,但是对于其他元素(现金stream量,资产负债表),父母标记是不是链接标记的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个iFrames。 所以,使用索引会混淆。 如果你不能识别frameElement,那么只能去索引。
参考:
你需要切换到正确的iframe – 他们都有不同的ID(或其他标签)在Java中看起来像这样(对于一些随机的iframe ID)
driver.switchTo().frame(driver.findElementById("defaultdestFB2-1"))