Использование combobox для изменения выбора элемента для использования Selenium C#

Я чувствую, что упускаю что-то фундаментальное. Можно ли передать такую строку? Я пытаюсь сделать универсальный веб-скребок, чтобы пользователь мог выбрать, какой элемент найти. Конечно, я получаю ошибку «‘ 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 ответ

  1. Объявить глобальную переменную как:

    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;
    }
    

    Таким образом, можно избежать объявления глобальных переменных.