在Selenium中创建WebElement

时间:2019-05-06 06:32:45

标签: c# selenium selenium-webdriver

我正在尝试创建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来删除。

我如何摆脱它或改善它?

2 个答案:

答案 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

不确定是否要查找相同的东西。也不能添加太多评论。