2016-11-23 52 views
1

我想點擊一個元素此頁上:硒網絡驅動程序如何選擇正確的IFRAME

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

在這一點上,我想點擊「現金流」,「資產負債表'或'Quarterly'。我知道這些按鈕已被加載,因爲我可以從頁面源使用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是我想要點擊的元素所屬的。我還通過I幀順序去了,還是沒找到我感興趣的元素。

回答

1

我只是在網站上檢查,他們(你正在尋找的元素)是在任何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可能沒有工作。


I幀之間切換:

你必須切換到該元素存在之前,我們試圖找出它的框架。

讓我們假設,你的元素在裏面3個I幀如下:

<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的內部:

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
+0

很不錯的答案!因此,爲了澄清,您如何能夠在複雜的網頁上識別框架是如何嵌套的?我一直在使用Firefox的Inspector,儘管它對我來說並不明顯,這是如何讓我找到iframe是如何包含在對方內的。 – AppleCider

+0

你必須去通過對HTML標籤的整個層次,從您要查找的元素,並檢查它的任何父元素是否是iframe代碼。