2016-09-05 7 views
0

를 사용하여 루프의 링크의 배열의 HREF 액세스하는 방법 :이 같은 특정 <code><a></code> 요소의 배열을 가지고 Watir과 - webdriver

array = browser.as(:class => 'foo') 

이 같은 링크로 이동하려고 :

$i = 0 
while $i < num do 
    browser.goto array[$i].href 
    . 
    . 
    . 
    $i += 1 
end 

첫 번째 루프에서는 작동하지만 두 번째 루프에서는 작동하지 않습니다. 왜 이런 일이 일어나는 걸까요? 내가

browser.goto array[$i].href 

전에

puts array[1].href 
puts array[2].href 
puts array[-1].href 

을 할 경우는 터미널 창에서 첫 번째 루프에있는 모든 링크를 보여줍니다.

+0

초 시간에 어떻게됩니까? 어떤 오류? puts array [1] .href의 결과는 무엇입니까? –

+0

출력 형식은 'http : // www.foo.com'입니다. 오류는'.href' 연산자를 사용하여 액세스 할 수 없다고하지만 루프에서 처음에는 잘 작동합니다. – Forwarding

+0

puts array [0], arrays [0] .href 및 puts array [1]의 결과는 무엇입니까? –

답변

3

내가하는 것보다 더 잘 알고있는 사람은 확인/명확히해야합니다. 내 이해는 요소가 페이지가로드 될 때 참조가 주어집니다. 새 페이지를로드 할 때 각 페이지에서 동일한 링크처럼 보이더라도 새로운 참조를 모두 작성합니다.

해당 요소에 대한 참조를 저장하고 그 요소에서 href 속성을 가져 오도록 요청하고 있습니다. 그것은 요소가 여전히 존재하기 때문에 처음으로 작동합니다. 새 페이지가로드되면 더 이상 존재하지 않습니다. 속성을 가져 오기 요청이 실패합니다.

걱정하시는 분들은 거기에 더 짧고 루비 한 방법이 있습니다.

array = [] 

browser.as(:class => 'foo').each { |link| 
    array << link.href 
} 

array.each { |link| 
    browser.goto link 
} 

링크를 링크로 밀어 넣음으로써 우리는 오래된 참조에 대해 걱정할 필요가 없습니다.

+0

이 접근 방식은 저에게 효과적이었습니다. – Forwarding

+0

'

'태그를 어떻게 복수화합니까? '주소'는 작동하지 않습니다. – Forwarding

2

예, 위치 지정자를 저장하고 페이지를 다시로드 할 때 개별 요소와 달리 요소 컬렉션은 다시 조회 할 수없는 셀레늄 요소 만 저장합니다.

이 패턴이 필요하고 그냥 href가 값보다 더 많은 컬렉션을 만들고 인덱스로 개별 요소를 사용하지 않는 경우에 대한 또 다른 해결책 :

num.times do |i| 
    link = browser.link(class: 'foo', index: i) 
    browser.goto link.href 
end 
+0

나는 그것이 영리하다는 것을 알았다. – Forwarding