splinter:在iframe中找不到元素
我想点击一个叫“估算运费”的链接,链接地址是 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 这样的插件来检查页面,这样能节省你很多时间。