【发布时间】:2016-12-08 06:12:06
【问题描述】:
在抓取表单时,我更喜欢通过标签查找字段,因为我正在使用的页面的大多数 ID 和名称都是自动生成的,我不能相信它们不会更改,而且标签很多比名称更具描述性。
而不是一直在我的脚本中这样做:
Mechanize::Page.elements_with 'label'
#...
some_form.field_with(
some_form.page.label_with(:text => "Address").node['for']
).value = "..."
some_form.field_with(
some_form.page.label_with(:text => "Zipcode").node['for']
).value = "..."
我已经开始在我的脚本顶部放置一个猴子补丁:
class Mechanize::Form::Field
def label_text
# hack to get the document root
root = node.ancestors.last
# look up the label for this field
label = root.at("label[for=#{dom_id.inspect}]") if dom_id
label && label.text
end
end
所以我可以这样做:
some_form.field_with( :label_text => "Address" ).value = "..."
some_form.field_with( :label_text => "Zipcode" ).value = "..."
这是一个 hack,但它现在可以工作。我可以使用更优雅的解决方案吗?
【问题讨论】:
-
所以您相信标签不会更改但不会更改字段名称?在我看来,您应该重新检查一下。
-
我相信标签不会频繁更换。
-
更改标签文本可能有充分的理由并且不会破坏任何内容。你认为这比没有理由的事情更不可能而且会破坏事情吗?
-
我想我宁愿不要像
ctl00_m_g_8cecb01f_9b31_4ee6_952c_eeea26359d2d_ctl00_ctl02_ctl00_ctl02_ctl00_ctl00_ctl00_ctl04_ctl00_ctl00_ctl04_ctl00_ctl0_TextField那样依赖ids(不夸张)。我猜如果他们改变任何两个字段的呈现顺序,那将会改变。而且我知道我宁愿通过“描述”的标签文本来查找它,而不是为我正在使用的每个字段复制/粘贴它。当然,如果标签发生变化,脚本会中断,但出于代码维护的目的,标签的描述性要强得多。 -
您应该发布表单的 html。也许有人能想出一个更好的主意。