splinter:在iframe中找不到元素

0 投票
2 回答
2473 浏览
提问于 2025-04-17 22:52

我想点击一个叫“估算运费”的链接,链接地址是 http://www.dresslink.com/women-woolen-winter-trench-double-button-fur-collar-coat-p-9442.html,点击后会打开一个覆盖层,这个覆盖层会通过ajax获取内容并填充进去。

这是我的代码

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标签,但它就是找不到。

2 个回答

0

这个东西文档写得不太好,所以花点时间去搞明白怎么做是正常的。昨晚我也遇到了同样的问题,所以我把我的方法分享在这里。Splinter对处理iframe有一个非常简单的解决办法!

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

在我的情况下,元素的名字是随机生成的字符串,所以上面的方法不能用。如果你遇到类似的问题,可以这样做:通过标签找到它(比如在我的例子中是input),然后从页面源代码中数一下它在iframe里面的input标签的顺序。这样你就可以用这个方法了:

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

我现在发现,dyanmic_shipping_list 在一个 div 里面,这个 div 的 ID 是 "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 浏览器,而不是 phantomjs。两个的命令基本上是一样的,所以你可以先用 Firefox 开发你的程序,之后再让它在 phantomjs 上运行。使用 Firefox 的话,你还可以用像 firebug 这样的插件来检查页面,这样能节省你很多时间。

撰写回答