2011-04-29 85 views
4

我使用WWW :: Mechanize :: Shell來測試東西。perl WWW ::機械化,鏈接重定向問題

我的代碼是這樣的:

#!/usr/bin/perl 
use WWW::Mechanize; 
use HTTP::Cookies; 

my $url = "http://mysite/app/login.jsp"; 
my $username = "username"; 
my $password = "asdfasdf"; 
my $mech = WWW::Mechanize->new(); 
$mech->cookie_jar(HTTP::Cookies->new()); 
$mech->get($url); 
$mech->form_number(1); 
$mech->field(j_username => $username); 
$mech->field(j_password => $password); 
$mech->click(); 
$mech->follow_link(text => "LINK A", n => 1); 
$mech->follow_link(text => "LINK B", n => 1); 

........................ ......... ............... ........................ 等等

問題是下一個:

LINK B(web_page_b.html),使重定向到web_page_x.html

如果我打印次電子商務mech- $>含量()的內容,顯示web_page_b.html

,但我需要顯示web_page_x.html,自動提交一個HTML表格(web_page_x.html)

的問題是:

我如何獲得web_page_x.html?

感謝

+2

什麼樣的重定向? Mech會自動跟蹤HTTP重定向,除非你不告訴它。如果這是一個Meta標籤或Javascript重定向,則需要對其進行反向工程並自行構建等效的HTTP請求。或者使用像Selenium這樣基於瀏覽器的系統。 – friedo 2011-04-29 19:48:47

回答

0

在情況下,它並沒有真正重定向,那麼你最好使用正則表達式與follow_link方法,而不僅僅是純文本。

如:

$mech->follow_link(url_regex => qr/web_page_b/i , n => 1); 

同爲其他鏈路。

+0

非常感謝你,但不起作用 – Sanx 2011-05-03 17:21:23

2

爲什麼不首先測試以確定包含重定向的代碼(我猜這是一個<META>標記?)存在於web_page_b.html,然後直接進入下一個頁面,一旦你確定這是一個什麼瀏覽器就完成了。

這看起來是這樣的:

$mech->follow_link(text => "LINK B", n => 1); 
    unless($mech->content() =~ /<meta http-equiv="refresh" content="5;url=(.*?)">/i) { 
    die("Test failed: web_page_b.html does not contain META refresh tag!"); 
    } 
    my $expected_redirect = $1;  # This should be 'web_page_x.html' 
    $mech->get($expected_redirect); # You might need to add the server name into this URL 

順便說一句,如果你做任何類型的測試與WWW::Mechanize,你應該檢查出Test::WWW::Mechanize和其他的Perl模塊的測試!他們讓生活變得更容易。

+0

謝謝,我嘗試你的建議,但它確實重定向了一個servlet,仍然沒有工作,還有其他想法嗎? – Sanx 2011-05-03 17:19:40

+0

嗯。您可以讓我們將源代碼中的重定向代碼看到web_page_b.html,也許可以將其上傳到http://gist.github.com/? – Gaurav 2011-05-04 18:37:51