selenium一个接一个地点击几个链接

时间:2013-08-07 08:33:09

标签: c# selenium webdriver selenium-webdriver

我在网页上有一个表格,其中有许多值重复如下:

Description     App Name    Information
Some Desc1       App1         Some Info
Some Desc2       App2         Some Info
Some Desc3       App2         Some Info
Some Desc4       App3         Some Info
Some Desc5       App4         Some Info

在我的应用程序开始时,它会要求用户输入他们选择的appname。我想要的是,如果我选择APP2,它应首先选择“Some Desc2”,这将导致另一个页面,我将在那里做点什么。然后它应该回到上一页,这次它应该选择“Some Desc3”,这将导致另一页。这应该重复多次,直到selenium找不到指定的appname。

我尝试过如下所示:

//Finding Table, its rows and coloumns
int rowcount = driver.FindElements(By.Id("someid")).Count;
for (int i = 0; i < rowcount; i++)
{
//Finding App name based on user entered text
  var elems = driver.FindElements(By.PartialLinkText(text));
  IList<IWebElement> list = elems;
  for (int j = 0; j < list.Count; j++)
  {
    var table = driver.FindElement(By.Id("someid"));
    IList<IWebElement> rows = table.FindElements(By.TagName("tr"));
    IList<IWebElement> cells = rows[i].FindElements(By.TagName("td"));
    //Again finding element based on user entered text
    var elem = driver.FindElements(By.PartialLinkText(text));
    list = elem;
    if (list[1].Text.Equals(text))
    {
      list[0].Click();
      string duration;
      string price;
      var elements = driver.FindElements(By.Id("SPFieldNumber"));
      IList<IWebElement> lists = elements;
      duration = lists.First().Text.ToString();
      price = lists.ElementAt(1).Text.ToString();
      MessageBox.Show(duration);
      MessageBox.Show(price);
      driver.Navigate().Back();
    }
 }

}

运行此代码会正确选择“Some Desc2”,一切都很顺利。但是在返回到上一页之后,c#会抛出一个异常“缓存中找不到的元素 - 也许页面因为查找了selenium而发生了变化”。

1 个答案:

答案 0 :(得分:2)

针对此特定问题,您会在循环前找到tablerow元素,然后在循环内调用driver.Navigate().Back();tablerow不再在DOM中(因为您的页面更改,DOM更改,表元素不再是您在循环外找到的那个)

尝试将它们放入循环中

int rowCount = driver.FindElements(By.CssSelector("#table_id tr")).Count; // replace table_id with the id of your table
for (int i = 0; i < rowCount ; i++)
{
    var table = driver.FindElement(By.Id("some ID"));
    rows = table.FindElements(By.TagName("tr"));
    // the rest of the code
}

然而,除了解决你的问题之外,我真的建议你先阅读Selenium documentation并先学习一些基本的C#编程,这样可以节省你很多时间在这里提问。

  • 你为什么每次都这样做?
var elems = driver.FindElements(By.PartialLinkText(text));
IList<IWebElement> list = elems;

// IList<IWebElement> list = driver.FindElements(By.PartialLinkText(text));
  • element.Text是您想要的字符串类型,无需调用ToString()
lists.First().Text.ToString();
// lists.First().Text;
  • 如果没有涉及框架,则不需要此项。
driver.SwitchTo().DefaultContent();
  • (来自您之前的帖子)IWebElement的列表永远不会等于字符串,结果不能是元素。如果您不知道自己想要什么类型,请避免使用var,因为它可能会让您完全不同。
IList<IWebElement> list = elems;
var elem= list.Equals(text);
  • (来自您之前的帖子)element.ToString()element.Text不同
string targetele = elem.ToString(); // you want elem.Text;