我無法找到一個網站,其中有幾層嵌套的框架來全面測試這個概念,但是我能夠在一個網站上只用一層嵌套框架來測試它。所以,這可能需要一些調試來處理更深的嵌套。此外,此代碼假定每個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會更加穩定。希望這可以幫助。
我很感謝你的工作。不過,我相信你誤解了這個問題:我不是在編寫HTML代碼,而是運行一個程序來讀取其他人寫的代碼並對其進行分析。所以我沒有問如何嵌套幀,而是如何使用硒的幀切換方法在它們之間切換。 – user3421410