2014-04-22 42 views
3

我想通過所有使用硒webdriver達到的網站的html進行搜索。在硒中,當我有一個iframe時,我必須切換到iframe,然後切換回主html以搜索其他iframe。Selenium - 獲取頁面中的所有iframe(甚至是嵌套的)?

但是,嵌套iframe可能會非常複雜。我必須切換到iframe,搜索iframe,然後切換到找到的iframe,搜索iframe,然後轉到另一個iframe,我必須切換到主框架,然後保存我的路徑以切換回我的位置之前等。

不幸的是,我發現的很多頁面在iframe內部的iframe中都有iframe(等等)。

有沒有一個簡單的算法呢?或者更好的方式呢?

回答

2

我無法找到一個網站,其中有幾層嵌套的框架來全面測試這個概念,但是我能夠在一個網站上只用一層嵌套框架來測試它。所以,這可能需要一些調試來處理更深的嵌套。此外,此代碼假定每個iframe都有一個name屬性。

我相信使用遞歸函數沿着這些線路將解決這個問題對你來說,這裏是一個示例數據結構與它一起去:

def frame_search(path): 
    framedict = {} 
    for child_frame in browser.find_elements_by_tag_name('frame'): 
     child_frame_name = child_frame.get_attribute('name') 
     framedict[child_frame_name] = {'framepath' : path, 'children' : {}} 
     xpath = '//frame[@name="{}"]'.format(child_frame_name) 
     browser.switch_to.frame(browser.find_element_by_xpath(xpath)) 
     framedict[child_frame_name]['children'] = frame_search(framedict[child_frame_name]['framepath']+[child_frame_name]) 
     ... 
     do something involving this child_frame 
     ... 
     browser.switch_to.default_content() 
     if len(framedict[child_frame_name]['framepath'])>0: 
      for parent in framedict[child_frame_name]['framepath']: 
       parent_xpath = '//frame[@name="{}"]'.format(parent) 
       browser.switch_to.frame(browser.find_element_by_xpath(parent_xpath)) 
    return framedict 

你會通過調用啓動它:frametree = iframe_search([])framedict最終會看起來像這樣:

frametree = 
{'child1' : 'framepath' : [], 'children' : {'child1.1' : 'framepath' : ['child1'], 'children' : {...etc}}, 
'child2' : 'framepath' : [], 'children' : {'child2.1' : 'framepath' : ['child2'], 'children' : {...etc}}} 

的說明:我寫這個使用幀的屬性來識別它們,而不是僅僅使用find_elements方法的結果的原因是,我找到了在某些情況下,Selenium會在頁面打開太久後拋出過時的數據異常,並且這些響應不再有用。顯然,框架的屬性不會改變,所以使用xpath會更加穩定。希望這可以幫助。

0

您可以通過記住簡單的代碼行將一個iFrame嵌套到另一個iFrame中,然後將光標重新定位到屏幕的相同區域,方法是使用下面的COMPLETE代碼中的as,永遠記住放置較大的iFrame FIRST,然後定義SMALLER iFrame SECOND的位置,如下面的完整示例:---

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

<html> 
<head> 
<title>Daneiella Oddie, Austrailian Ballet Dancer, dancing to Bach-Gounod's Ave Maria</title> 
</head> 
<body bgcolor="#ffffcc"> 

<DIV style="position: absolute; top:0px; left:0px; width:0px; height:0px"></div> 
<DIV style="position: absolute; top:10px; left:200px; width:900px; height:500px"> 

<iframe width="824" height="472" src="http://majordomoers.me/Videos/DanielaOddiDancingToBack_GounodsAveMaria.mp4" frameborder="0" allowfullscreen></iframe> 
</div> 

<DIV style="position: absolute; top:0px; left:0px; width:0px; height:0px"></div> 
<DIV style="position: absolute; top:10px; left:0px; width:50px; height:50px"> 

<iframe src="http://majordomoers.me/Videos/LauraUllrichSingingBach_GounodsAveMaria.mp4" frameborder="0" allowfullscreen></iframe> 

</div> 

<DIV style="position: absolute; top:0px; left:0px; width:0px; height:0px"></div> 
<DIV style="position: absolute; top:470px; left:10px; width:1050px; height:30px"> 

<br><font face="Comic Sans MS" size="3" color="red"> 
<li><b>Both Videos will START automatically...but the one with the audio will preceed the dancing by about 17 seconds. You should keep 
<li>both videos at the same size as presented here. In all, just lean back and let it all unfold before you, each in its own time.</li></font> 
</div> 
<br> 

</body> 
</html> 
+1

我很感謝你的工作。不過,我相信你誤解了這個問題:我不是在編寫HTML代碼,而是運行一個程序來讀取其他人寫的代碼並對其進行分析。所以我沒有問如何嵌套幀,而是如何使用硒的幀切換方法在它們之間切換。 – user3421410