2010-05-12 5 views
2

셀레늄 스크립트를 사용하여 하나씩 내 웹 페이지의 링크를 클릭하고 각 클릭이 페이지를 새로 고침합니다. 그러나 셀레늄은 방문과 같은 CSS 의사 클래스를 지원하지 않으므로 다음에 클릭하려는 것과 이미 클릭 된 것을 구별 할 수는 없습니다. 내 문제를 해결할 방법이 있습니까? XPath를 사용하여 그들을 통해 http://pastebin.com/z0uRTHHp셀렌 스크립트

답변

0
셀레늄 IDE 사용하여 해결하기위한

새로운 답 :

참고 : 당신은 https://addons.mozilla.org/en-US/firefox/addon/85794/에서 흐름 제어 플러그인을 설치 (또는 http://51elliot.blogspot.com/2008/02/selenium-ide-goto.html에서 사용자 확장 사용)

<tr> 
    <td>storeXpathCount</td> 
    <td>//body/descendant::a</td> 
    <td>linkCount</td> 
</tr> 
<tr> 
    <td>store</td> 
    <td>1</td> 
    <td>link</td> 
</tr> 
<tr> 
    <td>label</td> 
    <td>checkLink</td> 
    <td></td> 
</tr> 
<tr> 
    <td>echo</td> 
    <td>checking link ${link} of ${linkCount}</td> 
    <td></td> 
</tr> 
<tr> 
    <td>clickAndWait</td> 
    <td>//body/descendant::a[${link}]</td> 
    <td></td> 
</tr> 
<!-- ADD YOUR CHECKS HERE --> 
<tr> 
    <td>goBackAndWait</td> 
    <td></td> 
    <td></td> 
</tr> 
<tr> 
    <td>while</td> 
    <td>storedVars['link'] &lt;= storedVars['linkCount']</td> 
    <td></td> 
</tr> 
<tr> 
    <td>storeEval</td> 
    <td>storedVars['link'] = ${link} + 1;</td> 
    <td></td> 
</tr> 
<tr> 
    <td>gotolabel</td> 
    <td>checkLink</td> 
    <td></td> 
</tr> 
<tr> 
    <td>endWhile</td> 
    <td></td> 
    <td></td> 
</tr> 
+0

통해 해결하기위한 새로운 대답을 추가했습니다 .... – user121196

+0

clickAndWait 다음 xpath 셀레늄, 어떤 생각에서 작동하지 않습니다? clickAndWait // a [text() = 'Test'] [$ {link}] – user121196

+0

XPath의 미묘함 때문에 // // [1]이 첫 번째 요소 인 모든 하위 요소 'a'를 선택할 수 있습니다. 부모의 자녀들이 아닌, 전체 문서의 첫 번째 'a'요소가 아닙니다. 당신이'body/descendant :: a [1]'과 같은 것을 사용하거나'id ('myLinks')/descendant :: a [1]'과 같은 id를 가진 요소에 앵커링하는 것이 더 효과적 일 수 있습니다. 마지막 예제에서는'xpath ='로 locator를 진행해야한다. –

3

당신은 페이지에서 링크의 수를 반환 할 getXPathCount 명령을 사용할 수 있습니다, 다음 루프 :

여기 내 코드입니다. 셀레늄 RC와 자바를 사용하는 간단한 예는 다음과 같습니다

int linkCount = selenium.getXpathCount("/descendant::a").intValue(); 
for (int i = 0; i < linkCount; i++) { 
    selenium.click("/descendant::a[" + i + "]"); 
    selenium.waitForPageToLoad("60000"); 
    //ADD YOUR CHECKS HERE 
    selenium.goBack(); 
    selenium.waitForPageToLoad("60000"); 
} 

당신은 셀레늄 2 WebDriver를 사용하는 경우는, 다음 작업을해야하는 데 도움이

List<WebElement> links = driver.findElements(By.xpath("/descendant::a")); 
int lSize = links.size(); 

for (int l = 0; l < lSize; l++) { 
    links = driver.findElements(By.xpath("/descendant::a")); 
    WebElement link = links.get(l); 
    link.click(); 
    //ADD YOUR CHECKS HERE 
    driver.navigate().back(); 
} 

희망을.

+0

감사합니다. Firefox Addon의 javascript 및 html 테스트 케이스에서이 작업을 수행하고 있습니다. 제 질문의 코드 링크를 참조하십시오. 프레임 (html 및 javascript 테스트 케이스)에 개념을 맞추는 방법을 잘 모르겠습니다. 샘플 코드를 제공하고 도움을 줄 수 있습니까? – user121196

+0

셀렌 IDE –

0

을 클릭해야합니다 on 페이지의 전체 링크 :

@Test 
    public void test() throws InterruptedException { 
    try { 
    List<WebElement> no = driver.findElements(By.tagName("a")); 
    int nooflinks = no.size(); 
    System.out.println(nooflinks); 
    for (WebElement pagelink : no) { 
    no.click(); 
    String linktext = pagelink.getText(); 
    driver.navigate.refresh(); 
     Thread.sleep(1000); 
    System.out.println(linktext); 
     } 
    } 
    catch (Exception e){ 
    System.out.println("error "+e); 
     } 
    } 
0

먼저 웹 페이지의 모든 링크를 가져와야합니다. :

List<WebElement> links= driver.findElements(By.Tag('a')); 

당신이 특정 링크에 클릭으로 당신이이 경우에 완전히 클릭하여 다음 링크를 기다릴 필요가 있으므로, 페이지가 새로 고침 것입니다 클릭 후 언급 한 바와 같이 하나 하나를 반복해야 할 두 번째 문제 수 :

for(WebElement link: links) 
{ 
//wait for element to clickable 
WebDriverWait wait = new WebDriverWait(driver, 10); 
wait.until(ExpectedConditions.elementToBeClickable(link); 
link.click(); 
} 

당신은 무엇을 링크하는 것은 이미 링크 텍스트 색상이 퇴색하거나 클릭 한 후 변경됩니다 될 수 있으므로 클릭 된 것을 구분하려는 경우.