tags:

views:

161

answers:

2
+2  Q: 

selenium scripts

I want to use selenium scripts to click on a bunch of links on my webpage one by one, each click results in a page refresh. However selenium doesn't support css pseudo class like :visited, so I can't distinguish the ones that are already clicked from the ones that I want to click on next. Is there a way to solve my problem?

here's my code: http://pastebin.com/z0uRTHHp

A: 

You could use the getXPathCount command to return the number of links on the page, and then loop through them using XPath. A simple example using Java with Selenium RC follows:

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");
}

If you're using Selenium 2 or WebDriver, the following should work:

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();
}

Hope that helps.

Dave Hunt
thanks, I'm doing this in javascript and html test cases in Firefox addon, please see the code link in my question. I'm not sure how to fit your concept into the frame(html and javascript test case) I have, can you help and maybe provide some sample code?
Added new answer for solving through Selenium IDE
Dave Hunt
A: 

New answer for solving using Selenium IDE:

Note: You'll need to install the Flow Control plugin from https://addons.mozilla.org/en-US/firefox/addon/85794/ (or use the user-extension from 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>
Dave Hunt
you are good....
The following xpath with clickAndWait doesn't work in selenium, any idea? clickAndWait //a[text()='Test'][${link}]
It may be because of a subtlety in XPath where `//a[1]` will select all descendant `a` elements that are the first para children of their parents, and not the first `a` element in the entire document. It might work better for you to use something like `//body/descendant::a[1]` or anchor it to an element with an id like `id('myLinks')/descendant::a[1]`. Not that for the last example you would need to proceed the locator with `xpath=`.
Dave Hunt