-1

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

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

在我的应用程序开始时,它会要求用户输入他们选择的应用程序名称。我想要的是如果我选择 APP2 它应该首先选择“Some Desc2”,这将导致另一个页面,我会在那里做一些事情。然后它应该再次回到上一页,这一次它应该选择“Some Desc3”,这将导致另一个页面。这应该重复 n 次,直到 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 后已更改”。

4

1 回答 1

2

对于这个特定问题,您在循环之前找到tableandrow元素,然后通过driver.Navigate().Back();在循环内部调用,您的tableandrow不再在 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 文档并学习一些基本的 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;
于 2013-08-07T08:47:33.757 回答