2014-03-18 56 views
0

我試圖點擊http://www.dresslink.com/women-woolen-winter-trench-double-button-fur-collar-coat-p-9442.html 中名爲'Estimate Shipping Fee'的鏈接,該鏈接將打開一個iframe覆蓋圖,通過ajax提取內容並填充它。splinter:在iframe中找不到元素

這裏的代碼

from splinter import Browser 

browser = Browser('phantomjs') 

def extract(url): 
     browser.visit(url) 
     browser.find_by_css(".floatl.shipping_fee a").click() 
     browser.is_element_present_by_id('global_popup_login_iframe', wait_time=10) 
     with browser.get_iframe('global_popup_login_iframe') as iframe: 
       iframe.is_element_present_by_id('dyanmic_shipping_list', wait_time=10) 
       shippingprice = iframe.find_by_tag('img') 
       print shippingprice[1]['src'] 

extract('http://www.dresslink.com/women-woolen-winter-trench-double-button-fur-collar-coat-p-9442.html' 

的問題是,它似乎無法找到的iframe中的元素,我已經試過find_by_css,by_xpath,結果是一樣的。

splinter.exceptions.ElementDoesNotExist: no elements could be found with tag_name "img" 

確實存在一個img標記,但它找不到它。

+0

我試圖重現您的問題。到目前爲止,我被卡在'iframe.is_element_present_by_id('dyanmic_shipping_list',wait_time = 10)'。我猜這是一個拼寫錯誤,應該表示「dynamic_shipping_list」而不是「dyanmic_shipping_list」對嗎? 編輯:好的,它確實拼寫像這樣iframe的來源 '

' – MaSp

+0

等待,我只是再次檢查它,這是拼寫(dyanmic_shipping_list是正確的) – KJW

回答

1

我現在發現dyanmic_shipping_list位於divid="shipping_rates"之內,而不在iframe global_popup_login_frame之內。因此,在iframe中搜索將不會導致錯誤。但調用

browser.find_by_id("dyanmic_shipping_list").find_by_tag("img")[1]['src'] 

結果

u'http://misc.dresslink.com/nap/images/images_common/icon-china.jpg' 

是你想要的嗎?

編輯: 我用firefox作爲webbrowser而不是phantomjs。這兩個命令的主要內容都是相同的,所以你可以使用firefox開發你的程序,然後讓它使用phantomjs。 有了Firefox,你也可以檢查頁面插件像螢火蟲,什麼會爲你節省大量的時間

+0

大聲笑它甚至沒有內置iframe,我的壞。謝謝! – KJW

0

這沒有很好的文件,所以它需要一點時間來弄清楚如何去做,我是昨晚我也遇到了同樣的問題,所以我在這裏發佈我的方法。分裂對iframes有一個非常簡單的解決方法!

with br.get_iframe('Name_of_iframe') as iframe: 
    iframe.fill("Name_of_element_to_be_filled","Text_to_be_filled") 

在我的情況下,該元素的名稱是隨機生成的字符串,因此,上述不能使用。如果遇到這樣的問題,可以通過標籤(例如我的輸入法)找到它,從頁面源計算iframe中輸入標籤順序中的數字。然後,你可以這樣做: -

with br.get_iframe('Name_of_iframe') as iframe: 
    iframe.find_by_tag("tag_to_search")[index_number].fill(text_to_fill)