我正在尝试创建WebElement
对象。我看到有一个IWebElement
接口可以实现。
我也看到了这个question,并没有成功实现它。
在我的用例中,我从一个网页中获取所有表格,然后获取带有最多input
标签且未将type
属性设置为hidden
的标签。
这是我的用例代码:
using System;
using System.Linq;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace AutoWinner
{
class Program
{
static void Main(string[] args)
{
IWebDriver driver = new ChromeDriver();
driver.Url = "https://keepass.info/help/kb/testform.html";
var forms = driver.FindElements(By.TagName("form"));
var longestFormLengthOfAllForms = 0;
// I don't the p element.
// It's more here to just get a webElement which ic can later overwrite.
var mainForm = driver.FindElement(By.TagName("p"));
foreach (var form in forms)
{
Console.WriteLine(form.GetAttribute("outerHTML"));
var children = form.FindElements(By.TagName("input"));
var lengthOfCurrentForm = children.Count(x => x.GetAttribute("type") != "hidden");
if (lengthOfCurrentForm > longestFormLengthOfAllForms)
{
longestFormLengthOfAllForms = lengthOfCurrentForm;
mainForm = form;
}
}
Console.WriteLine(mainForm.GetAttribute("outerHTML"));
}
}
}
第var mainForm = driver.FindElement(By.TagName("p"));
行是一个全局变量,以后将其主要形式保存在其中。我不需要p
元素。
我的想法是通过创建标准webElement
来删除。
我如何摆脱它或改善它?
答案 0 :(得分:1)
鉴于您当前的用例,我建议使用以下代码。它抓住FORM
个标记,循环遍历每个标记,并计数不是INPUT
的{{1}}个。一旦它脱离type='hidden'
,for-each
就是所需mainForm
数量最多的FORM
。
INPUT
我在下面创建的示例HTML页面中对此进行了测试
IWebElement mainForm = null;
IReadOnlyCollection<IWebElement> forms = Driver.FindElements(By.CssSelector("form"));
int maxCount = 0;
foreach (IWebElement form in forms)
{
int count = form.FindElements(By.CssSelector("input:not([type='hidden'])")).Count;
if (count > maxCount)
{
maxCount = count;
mainForm = form;
}
}
// do something with mainForm
Console.WriteLine(mainForm?.GetAttribute("name"));
答案 1 :(得分:0)
我仍然没有得到您的用例。但是无论如何,如果您正在寻找这样的东西:
假设您有两个这样的Web元素:
var ele1 = driver.FindElement(By.Xpath("//"));
var ele2 = driver.FindElement(By.Xpath("//"));
ele1指向一个元素,而ele2指向第二个元素。
ele2 = ele1
现在,ele2
应该指向ele1
。
不确定是否要查找相同的东西。也不能添加太多评论。