Tôi có một kịch bản cơ giới hóa được viết bằng python điền vào biểu mẫu web và được cho là nhấp vào nút 'tạo'. Nhưng có một vấn đề, biểu mẫu có hai nút. Một cho 'thêm tập tin đính kèm' và một cho 'tạo'. Cả hai đều thuộc loại 'submit' và nút đính kèm là nút đầu tiên được liệt kê. Vì vậy, khi tôi chọn diễn đàn và làm br.submit(), nó nhấp vào nút 'đính kèm' thay vì 'tạo'. Googling mở rộng đã mang lại không có gì hữu ích cho việc lựa chọn một nút cụ thể trong một hình thức. Có ai biết về bất kỳ phương pháp bỏ qua nút 'gửi' đầu tiên và nhấp vào thứ hai?Cơ giới hóa Python - hai nút loại 'submit'
Trả lời
Tôi đã thử sử dụng thông số nr, không có bất kỳ sự may mắn nào.
tôi đã có thể có được nó để làm việc với một sự kết hợp của các tên và nhãn thông số, nơi "label" dường như tương ứng với "giá trị" trong HTML:
Dưới đây là hai nút nộp của tôi:
<input type="submit" name="Preview" value="Preview" />
<input type="submit" name="Create" value="Create New Page" />
...và đây là mã nhấp vào nút đầu tiên, quay lại và sau đó nhấp vào mã thứ hai:
from mechanize import Browser
self.br = Browser()
self.br.open('http://foo.com/path/to/page.html')
self.br.select_form(name='my_form')
self.br['somefieldname'] = 'Foo'
submit_response = self.br.submit(name='Preview', label='Preview')
self.br.back()
self.br.select_form(name='my_form')
self.br['somefieldname'] = 'Bar'
submit_response = self.br.submit(name='Create', label='Create New Page')
Có một biến thể cũng làm việc cho tôi, nơi "tên" của nút gửi giống nhau, chẳng hạn như :
<input type="submit" name="action" value="Preview" />
<input type="submit" name="action" value="Save" />
<input type="submit" name="action" value="Cancel" />
và
self.br.select_form(name='my_form')
submit_response = self.br.submit(name='action', label='Preview')
self.br.back()
submit_response = self.br.submit(name='action', label='Save')
LƯU Ý QUAN TRỌNG - tôi đã chỉ thể nhận được bất kỳ mã đa nộp nút này để làm việc sau khi xóa một số HTML trong phần còn lại của trang.
Cụ thể, tôi không thể có <br/>
- thay vào đó tôi phải có <br />
... và, thậm chí còn ít ý nghĩa hơn, tôi không thể có bất kỳ điều gì giữa hai nút gửi.
Nó thất vọng tôi không có kết thúc rằng lỗi mechanize/ClientForm tôi săn trong hơn hai tiếng đồng hồ luộc xuống này:
<tr><td colspan="2"><br/><input type="submit" name="Preview" value="Preview" /> <input type="submit" name="Create" value="Create New Page" /></td></tr>
(trên cùng một dòng) đã không làm việc, nhưng
<tr><td colspan="2"><br />
<input type="submit" name="Preview" value="Preview" />
<input type="submit" name="Create" value="Create New Page" /></td></tr>
hoạt động tốt (trên nhiều dòng, cũng không nên có vấn đề).
Tôi thích cơ giới hóa vì dễ cài đặt (chỉ cần sao chép các tệp vào thư mục bao gồm của tôi) và vì nó khá dễ sử dụng, nhưng trừ khi tôi thiếu thứ gì đó lớn, tôi nghĩ rằng các lỗi như thế này thật tệ - Tôi không thể nghĩ ra một lý do chính đáng nào cả vì sao ví dụ đầu tiên sẽ thất bại và ví dụ thứ hai sẽ hoạt động.
Và, tình cờ, tôi cũng tìm thấy một lỗi cơ giới hóa khác trong đó <textarea>
được chứa trong một <p>
không được công nhận là điều khiển hợp lệ, nhưng sau khi bạn lấy nó ra khỏi thùng chứa <p>
nó được chấp nhận tốt. Và tôi đã kiểm tra, văn bản là được phép bao gồm trong các phần tử cấp khối khác như <p>
.
Tôi có thể nói từ kinh nghiệm sử dụng HTTP, chứ không phải là cơ giới hóa, nhưng tôi nghĩ rằng đây có lẽ là những gì bạn muốn.
Khi có hai nút gửi trong biểu mẫu, máy chủ có thể xác định nút nào được nhấn, vì khách hàng phải thêm đối số cho nút gửi. Vì vậy:
<form action="blah" method="get">
<p>
<input type="submit" name="button_1" value="One" />
<input type="submit" name="button_2" value="Two" />
</p>
</form>
sẽ đưa bạn một trong hai URL:
blah?button_1=One
hay:
blah?button_2=Two
Tùy thuộc vào nút được nhấn.
Nếu bạn đang lập trình xác định đối số nào sẽ được gửi, bạn cần phải thêm đối số với tên nút gửi đã được nhấn và giá trị của nó.
Tôi khuyên bạn nên sử dụng Twill sử dụng cơ giới hóa (chủ yếu là monkeypatched). Vì vậy, giả sử bạn có biểu mẫu với một số trường và hai nút gửi có tên "submit_to_preview" và "real_submit". Mã sau đây sẽ hoạt động.
BTW nhớ đây không phải là luồng an toàn, do đó bạn có thể muốn sử dụng khóa trong trường hợp nếu bạn muốn sử dụng mã trong thư mục được ghim.
import twill.commands
b = twill.get_browser()
url = "http://site/myform"
twill.commands.go(url)
twill.commands.fv("2", "name", "Me")
twill.commands.fv("2", "age", "32")
twill.commands.fv("2", "comment", "useful article")
twill.commands.browser.submit("real_submit")
Hy vọng điều đó sẽ hữu ích. Chúc mừng.
Sử dụng phương pháp 'nhấp'. Ví dụ.
mybrowser.select_form(nr=0)
req = mybrowser.click(type="submit", nr=1)
mybrowser.open(req)
Nên hoạt động.