我正在尝试遍历页面上的元素,并且所有这些元素都归类在html <article>
关键字下。我该怎么办?
<article>
<div class="inner-article">
<a style="height:150px;" href="/shop/jackets/v87vh6cpt/rnv032l4i">
<img width="150" height="150"
src="//assets.supremenewyork.com/179529/vi/4DVL66YDwcs.jpg"
alt="4dvl66ydwcs">
<div class="sold_out_tag">sold out</div>
</a>
<h1>
<a class="name-link"
href="/shop/jackets/v87vh6cpt/rnv032l4i">Supreme®/Honda®/Fox® Racing Puffy
Zip Up Jacket</a>
</h1>
<p>
<a class="name-link" href="/shop/jackets/v87vh6cpt/rnv032l4i">Black</a>
</p>
</div>
</article>
简而言之,我需要遍历页面上的一堆元素(上面列出了HTML代码),并使用关键字来针对innerHTML测试关键字:Supreme®/ Honda®/Fox®Racing蓬松拉链夹克。关键字如下:Honda,Fox和Puffy。
如果一个元素与2个或多个关键字匹配,则它会单击该元素。
do
{
driver.Navigate().Refresh();
try
{
driver.FindElement(By.LinkText("Breed Crewneck"));
elementFound = true;
}catch(NoSuchElementException error)
{
Console.WriteLine("No such element found!");
}
} while (elementFound == false);
这是我当前的代码。它仅在页面中查找LinkText元素。 不是可行的,因为它需要特定的字符串; LinkText选项不能使用关键字。此外,它是对/错的条件语句。我需要实现迭代。
答案 0 :(得分:1)
是这样吗?:
var driveroptions = new ChromeOptions();
driveroptions.AddUserProfilePreference("disable-popup-blocking", "true");
using (IWebDriver driver = new ChromeDriver(this.SeleniumDriverPath, driveroptions))
{
try
{
driver.Navigate().GoToUrl("http://www.google.com/");
IWebElement query = driver.FindElement(By.Name("q"));
query.SendKeys("link");
query.Submit();
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
//
var listElement = driver.FindElements(OpenQA.Selenium.By.XPath(".//*[@id='search']//div[@class='g']"));
foreach( var e in listElement)
{
//include ctrl+click:
//var action = new OpenQA.Selenium.Interactions.Actions(driver);
//action.KeyDown(Keys.Control).Build().Perform();
//or click:
if ("Supreme®/Honda®/Fox® Racing Puffy Zip Up Jacket".Contains(e.Text))
{
e.Click();
}
}
//
}
driver.Quit();
}
基本上,您可以通过XPath找到元素:
driver.FindElements(OpenQA.Selenium.By.XPath(".//*article//a[@class='name-link']"));
或按类名:
driver.FindElements(OpenQA.Selenium.By.ClassName("name-link"))
重复并根据条件执行点击?
答案 1 :(得分:1)
1)您将获得所有文章中所有链接的列表
protected IList<IWebElement> FindNestedElements()
{
return FindElement(By.XPath("your xpath for
class="name-link" element")).FindElements(By.XPath("your Xpath for article elements"));
}
2)一旦您收集了页面上所有文章中的所有名称,就执行foreach循环,在每个循环中首先进行ur获取每个element.Text元素的文本,然后检查一下条件(比较是否包含文本u如果需要,请点击。
var values = new [] {"Honda", "Fox", "Puffy"};
foreach (IWebElement element in FindNestedElements())
{
if(values.Any(element.Text.Contains);)
{
element.click;
}
答案 2 :(得分:-1)
我将关键字列表存储在字符串数组中。然后抓住每个A
标签下的每个ARTICLE
标签(其中包含产品名称,例如“Supreme®/Honda®/Fox®Racing Puffy
Zip Up Jacket”),然后使用LINQ对该字符串中的关键字数进行计数。如果计数> = 2,则单击该元素。代码如下。
string[] keywords = { "Honda", "Fox", "Puffy" };
foreach (IWebElement link in _driver.FindElements(By.CssSelector("article a.name-link")))
{
if (keywords.Count(w => link.Text.Contains(w)) >= 2)
{
link.Click();
break;
}
}