转到HTML表中具有特定文本的每个链接



网页上有HTML表格。我试图浏览它的每个链接,并在href元素中找到某些单词。比方说,我需要找到"车"、"房子"、"城市"。如果链接文本中存在这些单词中的任何一个,我希望selenium继续到每个符合条件的链接,并在子页面上执行一些其他操作(我有子页面操作的其余代码(。

HTML表XPath://*[@id="datatable"]

我可能需要使用类似的东西?

List<string> matchingLinks = new List<string>();
ReadOnlyCollection<IWebElement> links = driver.FindElements(By.TagName("a"));
// LINQ is better?
foreach (IWebElement link in links)
{
string text = link.Text;
if (Regex.IsMatch("car", text))
{
matchingLinks.Add(text);
}
}
foreach (string linkText in matchingLinks)
{
IWebElement element = driver.FindElement(By.LinkText(linkText));
element.Click();
driver.Navigate().Back();
}

然而,这并没有考虑到我的表。此外,如何分配更多的"搜索词"除了"汽车"?

链接XPath(如您所见,只有tr[7]根据行而变化(:

//*[@id="datatable"]/tbody/tr[1]/td[3]/a
...
//*[@id="datatable"]/tbody/tr[7]/td[3]/a
...
//*[@id="datatable"]/tbody/tr[11]/td[3]/a
//*[@id="datatable"]/tbody/tr[12]/td[3]/a

编辑:

示例:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System;
namespace Tenders_Collection_Robot
{
public static class WebDriverExtensions
{
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
{
if (timeoutInSeconds > 0)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return driver.FindElement(by);
}
}
class Program
{
static void Main(string[] args)
{
// declare chrome options with prefs
var options = new ChromeOptions();
// options.AddArguments("headless"); // we add headless here
options.AddUserProfilePreference("download.default_directory", "C:\temp\downloadfolder");
options.AddUserProfilePreference("plugins.always_open_pdf_externally", true);
var r = new Random();
// Initialize the Chrome Driver // chromeOptions
using (var driver = new ChromeDriver(options))
{
// Go to the home page
driver.Navigate().GoToUrl("https://html.com/tables/");
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(15);
ClickTableLink("col");
}
}
public static void ClickTableLink(String value)
{
var driver = new ChromeDriver();
var table = driver.FindElement(By.ClassName("related-elements"));
foreach (var tr in table.FindElements(By.TagName("tr")))
{
var tds = tr.FindElements(By.TagName("a"));
for (var i = 0; i < tds.Count; i++)
{
if (tds[i].Text.Trim().Contains(value))
{
tds[i].Click();
break;
}
}
}
}
}
}

向你抛出一些想法,Hatman。

关于你的第一个功能。。。。

您可以传递"name"的值,然后。。。

using System.Linq;
using System.Collections.Generic;
List<String> item = new List<string>();
IReadOnlyList<IWebElement> cells = driver.FindElements(By.TagName("a"));
foreach (IWebElement cell in cells)
{
item.Add(cell.Text);
}

然后运行断言,确定找到的任何"a"值都包含文本?

Assert.IsTrue(item.Any(itm => itm.Contains(name)));

还有什么你可以试试的?在下面,"值"可以是你搜索的任何唯一值,比如电子邮件、姓名、账号。"Value"是=i。因此,如果你的链接是i右边的两列,你可以说点击tds[i+2].click((;。如果你想点击的链接是i左边的三列,tds[i-3].click((;您也可以从这里获取文本并相应地断言。

public void ClickTableLink(String value)
{
var table =  driver.FindElement(By.Id("table"));
foreach (var tr in table.FindElements(By.TagName("tr")))
{
var tds = tr.FindElements(By.TagName("a"));
for (var i = 0; i < tds.Count; i++)
{
if (tds[i].Text.Trim().Contains(value))
{
tds[i].Click(); 
break;
}
}
}
}

下面是另一个例子。。。。。

<table id="mytable"> 
<tr> 
<th>Name</th> <th> Link1</th> <th>Favorite Color</th>  <th>Link2</th>
</tr> 
<tr> 
<td>Bob</td> 
<td><a href="https://foxnews.com">Fox</a></td> 
<td>Yellow</td> 
<td><a href="https://cnn.com">CNN</a> </td> 
</tr> 
<tr> 
<td>Jim</td> 
<td><a href="https://foxnews.com">News1</a></td> 
<td>Blue</td> 
<td><a href="https://cnn.com">News2</a> </td> 
</tr> 
<tr> 
</tr> 
</table> 

这将查找"Bob"并从链接中获取文本,并验证它是否与值2匹配。

var value = "Bob";
var value2 = "Fox";
var table = Browser.FindElement_byId("mytable");
foreach (var tr in table.FindElements(By.TagName("tr")))
{
var tds = tr.FindElements(By.TagName("td"));
for (var i = 0; i < tds.Count; i++)
{
if (tds[i].Text.Trim().Contains(value))
{
var test = tds[i + 1].Text.Trim();
Assert.IsTrue(test.Contains(value2));
break;
}
}
}

相关内容

  • 没有找到相关文章

最新更新