2016-05-14 90 views
1

在OSX和Firefox上使用perl 5.22和Selenium :: Remote :: WebElement :: VERSION ='0.2701'。第一次嘗試使用Selenium(也是XPath!)。爲什麼find_child_elements忽略Perl Selenium中的第一個參數?

我的問題出現了,當我試圖讓一個給定的「<選擇>」的孩子,然後枚舉所有其「<選項」> S作爲這樣的:

use strict; 
use warnings; 
use Selenium::Remote::Driver; 
use Selenium::Remote::WebElement; 
use URI::file; 

my $extraCaps = {"browser" => "Firefox", "browser_version" => "42.0","os" => "OSX","os_version" => "7","resolution" => "1024x768"}; 

my $driver = new Selenium::Remote::Driver('remote_server_addr' => 'localhost', 'port' => '4444','extra_capabilities' => $extraCaps); 
$driver->get(URI::file->new_abs('./test.html')->as_string); 
sleep(2); 
# get <select> named 'SEL2': 
my $sel2 = $driver->find_element('//select[@name="SEL2"]'); 
# this works, but it's not what i want: my $sel2_options = $driver->find_child_elements($sel2, '//select[@name="SEL2"]//option'); 
# get all the options for **that specific** <select> 
my $sel2_options = $driver->find_child_elements($sel2, '//option'); 
foreach my $ap (@$sel2_options){ 
    print "found option ".$ap->get_text()."\n"; 
} 
sleep(1); 
$driver->quit(); 

輸入HTML文件(test.html中)是:

<!DOCTYPE html> 
<head></head> 
<body> 
<select name="SEL1" id="ID1"> 
    <option value="SEL1-option11">SEL1-option1</option> 
    <option value="SEL1-option12">SEL1-option2</option> 
    <option value="SEL1-option13">SEL1-option3</option> 
</select> 
<select name="SEL2" id="ID2"> 
    <option value="SEL2-option1">SEL2-option1</option> 
    <option value="SEL2-option2">SEL2-option2</option> 
    <option value="SEL2-option3">SEL2-option2</option> 
</select> 
</body></html> 

和輸出我得到的是:

found option SEL1-option1 
found option SEL1-option2 
found option SEL1-option3 
found option SEL2-option1 
found option SEL2-option2 
found option SEL2-option2 

不應該我只獲得 SEL2列出的選項?

我做錯了什麼?在我看來,對於這種情況,find_child_elements忽略了它的第一個參數 - 據我瞭解 - WebElement將指定的選擇器(//選項)應用於它。

在另一方面,這正常工作,但它在某種程度上違背了目的:

my $sel2_options = $driver->find_child_elements($sel2, '//select[@name="SEL2"]//option'); 

千恩萬謝, bliako

+0

嘗試'我的$ sel2_options = $ sel2-> find_elements( '//選項');' –

+0

不,在我係統中,sel2(Selenium :: Remote :: WebElement)中沒有方法'find_elements' – bliako

+0

我懷疑問題是'$ sel2'(也許它是空的?)。你不需要在xpath中轉義'@',即:'my $ sel2 = $ driver-> find_element('//選擇[\ @ name =「SEL2」]');'?示例至少如此說明:http://search.cpan.org/~chowes/Selenium-Remote-Driver-0.17/lib/Selenium/Remote/Driver.pm#find_child_elements –

回答

1

/在一個XPath總是引用文檔的根節點的開始。這就是爲什麼您只能從$sel2獲得所有option元素而不是option。嘗試添加.在的XPath的開始,使之相對於當前元素上下文:

my $sel2_options = $driver->find_child_elements($sel2, './/option'); 
+0

請downvote我! CPAN文檔中有一個例子,Kiril S.引用了'find_child_element()',並且已經讀取並重新讀取:用法:'my $ elem1 = $ driver-> find_element(「// select [\ @ name = 'ned']「);''注意./當搜索子元素而不是//''my $ child = $ driver-> find_child_element($ elem1,」./option[\@value= ''es_ar']「);'然而在同一文檔中,'find_child_elements()'部分的例子這樣說:'用法:my $ elem1 = $ driver-> find_element(」// select [\ @ name ='ned 「]「); my $ child = $ driver-> find_child_elements($ elem1,「// option」);' – bliako

+0

...不用說我遵循find_child_elements()部分中的示例。只是爲了與Selenium(這是一個很酷的工具)分享我的經驗:我發現添加一個SIG處理程序來退出硒客戶端在ctrl-C或die()的情況下非常有用,否則它仍然在後臺運行,請注意每個die()Selenium正在拋出的'__DIE__'處理函數:'$ SIG {INT} = $ SIG {HUP} = $ SIG {''__DIE__'''} = $ SIG {TERM} =(sub {$ selenium - > quit});'謝謝你的幫助。 – bliako

相關問題