使用组合框更改哪个元素选择器使用Selenium C#

时间:2017-01-17 04:48:18

标签: c# selenium

我觉得我在这里缺少一些基本的东西。是否可以传递这样的字符串?我正在尝试制作一个通用的Web scraper,用户可以选择要查找的元素。我当然会收到错误"' By'不包含' elementFind'"的定义

我记得阅读有关创建自定义类的内容,但我不确定是否会让我到达我想去的地方,因为我觉得你必须修改Selenium命名空间。

namespace WebScraper
{
    public partial class WebScraper : Form
{
    public string url;
    public string elementFind;
    public string elementString;
    public WebScraper()
    {
        InitializeComponent();
    }

    private void urlBox_TextChanged(object sender, EventArgs e)
    {
        url = urlBox.Text;
    }

    public void elementPicker()
    {
        switch (comboBox.SelectedIndex)
        {
            case 0:
                elementFind = "ID";
                break;
            case 1:
                elementFind = "Name";
                break;
            case 2:
                elementFind = "Class";
                break;
            case 3:
                elementFind = "XPath";
                break;
            case 4:
                elementFind = "CSS Selector";
                break;
            case 5:
                elementFind = "LinkText";
                break;
            case 6:
                elementFind = "Text";
                break; 
        }
    }

    private void chromeBtn_Click(object sender, EventArgs e)
    {
        IWebDriver driver = new ChromeDriver();
        driver.Navigate().GoToUrl(url);
        driver.FindElement(By.elementFind(elementString));
    }
    }
}

1 个答案:

答案 0 :(得分:0)

将全局变量声明为:

By findBy;

修改elementPicker()这样的内容:

public void elementPicker(string value)
{
    switch(comboBox.SelectedIndex)
    {
    case 0:
        findBy = By.Id(value);
        break;
    //Same for all case
    }
}

然后chromeBtn_Click中的代码看起来像这样:

.......
elementPicker();
driver.FindElement(findBy);

这是参考你发布的代码;我不了解您的应用程序的其他工作流程。

更好的解决方案是编写如下的新函数:

public By GetFindByType(string value)
{
    By findBy;
    //Similar switch-case as above
    return findBy;
}

这样,您就可以避免声明全局变量。