2014-02-05 71 views
0

當刮表單時,我更願意通過標籤來查找字段,因爲我正在使用的大多數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 = "..." 

這是一個黑客,但它現在的作品。有沒有更優雅的解決方案,我可以使用?

+0

因此,你相信標籤不能改變,但不能形成字段名稱?在我看來,你應該重新審視這個問題。 – pguardiario

+0

我相信標籤變化不太頻繁。 – rampion

+0

更改標籤文本是可能有很好的理由和不會破壞任何東西的東西。你認爲這樣做比沒有理由並且會破壞事物的可能性更小? – pguardiario

回答

1

我發現了一個不涉及猴子修補的更好的解決方案。由於{element}_with標準使用===匹配,我可以通過它lambda

# convenince methods to define matcher lambdas 

def has_title expected 
    lambda { |node| expected === node['title'] 
end 

def has_label expected 
    lambda do |node| 
    # hack to get the document root 
    root = node.ancestors.last 
    dom_id = node['id'] 
    # look up the label for this field 
    label = root.at("label[for=#{dom_id.inspect}]") if dom_id 
    # check if it matches 
    expected === (label && label.text) 
    end 
end 

some_form.field_with(:node => has_label("Address")).value = "..." 
some_form.field_with(:node => has_label("Zipcode")).value = "..." 
some_form.field_with(:node => has_title("Description")).value = "..." 
... 
+0

如何在這段代碼中定義'dom_id'的局部變量? – jonkratz

+0

jonkratz:很好的電話。看起來這是從我的monkeypatch,當它提到'機械化::形式::字段#dom_id'的擱置。現在解決。 – rampion

0

你可以做這樣的事情:

def get_key page, str 
    id = page.at("label[text()*='#{str}']")[:for] 
    key = page.at("##{id}")[:name] 
end 

然後

form[get_key(page, 'Address')] = value 

這是一個有點清潔但仍然是一團糟。這需要有一個真正的好理由,而我會因爲繼承的代碼而感到煩惱。