我在网页上有一个表格,其中有许多值重复如下:
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而发生了变化”。
答案 0 :(得分:2)
针对此特定问题,您会在循环前找到table
和row
元素,然后在循环内调用driver.Navigate().Back();
,table
和row
不再在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;