Làm cách nào để chọn một tùy chọn từ trình đơn thả xuống bằng Selenium WebDriver C #?


86

Tôi đang cố gắng cho bài kiểm tra web của mình và chọn một tùy chọn. Có thể tìm thấy một ví dụ tại đây: http://www.tizag.com/phpT/examples/formex.php

Mọi thứ đều hoạt động tốt ngoại trừ việc chọn một phần tùy chọn. Làm thế nào để chọn một tùy chọn theo giá trị hoặc theo nhãn?

Mã của tôi:

using OpenQA.Selenium.Firefox;
using OpenQA.Selenium;
using System.Collections.ObjectModel;
using System.Text.RegularExpressions;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;

class GoogleSuggest
{
    static void Main()
    {
        IWebDriver driver = new FirefoxDriver();

        //Notice navigation is slightly different than the Java version
        //This is because 'get' is a keyword in C#
        driver.Navigate().GoToUrl("http://www.tizag.com/phpT/examples/formex.php");
        IWebElement query = driver.FindElement(By.Name("Fname"));
        query.SendKeys("John");
        driver.FindElement(By.Name("Lname")).SendKeys("Doe");
        driver.FindElement(By.XPath("//input[@name='gender' and @value='Male']")).Click();
        driver.FindElement(By.XPath("//input[@name='food[]' and @value='Chicken']")).Click();
        driver.FindElement(By.Name("quote")).Clear();
        driver.FindElement(By.Name("quote")).SendKeys("Be Present!");
        driver.FindElement(By.Name("education")).SendKeys(Keys.Down + Keys.Enter); // working but that's not what i was looking for
        // driver.FindElement(By.XPath("//option[@value='HighSchool']")).Click(); not working
        //  driver.FindElement(By.XPath("/html/body/table[2]/tbody/tr/td[2]/table/tbody/tr/td/div[5]/form/select/option[2]")).Click(); not working
        // driver.FindElement(By.XPath("id('examp')/x:form/x:select[1]/x:option[2]")).Click(); not working

        }
}

Câu trả lời:


184

Bạn phải tạo một đối tượng phần tử được chọn từ danh sách thả xuống.

 using OpenQA.Selenium.Support.UI;

 // select the drop down list
 var education = driver.FindElement(By.Name("education"));
 //create select element object 
 var selectElement = new SelectElement(education);

 //select by value
 selectElement.SelectByValue("Jr.High"); 
 // select by text
 selectElement.SelectByText("HighSchool");

Thông tin thêm tại đây


hoạt động như một sự quyến rũ cảm ơn! điều đó giúp mọi thứ nhanh hơn cho các bài kiểm tra của tôi!
mirza

Có một lỗi. var selectElement = new SelectElement(education);Nên là:var selectElement = new SelectElement(element);
Greg Gauthier

51
FYI: Để sử dụng Phần tử Chọn, bạn cần bao gồm gói Hỗ trợ Selenium Webdriver, là một gói NuGet khác với Selenium WebDriver. Bao gồm không gian tên OpenQA.Selenium.Support.UI.
James Lawruk

Tôi đang sử dụng trình điều khiển firefox, phiên bản selenium 2.53.1 và hỗ trợ thư viện 2.53, SelectByText dường như không hoạt động. Tôi có thể thấy tất cả các tùy chọn. Thậm chí nếu tôi lặp các tùy chọn và thiết lập giá trị đúng, giá trị không nhận được sự giúp đỡ set..Any sẽ là tuyệt vời
Viswas Menon

3
Bạn đã thử các trình điều khiển khác hay chỉ Firefox? Ngoài ra, tên kỹ thuật của gói hiện là Selenium.Support.
Dan Csharpster

13

Thêm một điểm cho điều này- Tôi đã gặp sự cố rằng không gian tên OpenQA.Selenium.Support.UI không khả dụng sau khi cài đặt liên kết Selenium.NET vào dự án C #. Sau đó, phát hiện ra rằng chúng tôi có thể dễ dàng cài đặt phiên bản mới nhất của Lớp hỗ trợ Selenium WebDriver bằng cách chạy lệnh:

Install-Package Selenium.Support

trong NuGet Package Manager Console hoặc cài đặt Selenium.Support từ NuGet Manager.


9

Cách khác có thể là cách này:

driver.FindElement(By.XPath(".//*[@id='examp']/form/select[1]/option[3]")).Click();

và bạn có thể thay đổi chỉ mục trong tùy chọn [x] thay đổi x theo số phần tử mà bạn muốn chọn.

Tôi không biết nó có phải là cách tốt nhất hay không nhưng tôi hy vọng rằng sẽ giúp bạn.


Tôi không chắc điều này luôn hoạt động. Ai đó đã làm nó theo cách này và nó đã không làm việc và tôi đã kết thúc phải thay đổi mã để mã được đề xuất bởi Matthew Lock
Fractal

3

Để chọn một tùy chọn qua văn bản;

(new SelectElement(driver.FindElement(By.XPath(""))).SelectByText("");

Để chọn một tùy chọn thông qua giá trị:

 (new SelectElement(driver.FindElement(By.XPath(""))).SelectByValue("");

3

Mã Selenium WebDriver C # để chọn mục từ Drop Down:

IWebElement EducationDropDownElement = driver.FindElement(By.Name("education"));
SelectElement SelectAnEducation = new SelectElement(EducationDropDownElement);

Có 3 cách để chọn mục thả xuống: i) Chọn theo Văn bản ii) Chọn theo Chỉ mục iii) Chọn theo Giá trị

Chọn theo Văn bản:

SelectAnEducation.SelectByText("College");//There are 3 items - Jr.High, HighSchool, College

Chọn theo Chỉ mục:

SelectAnEducation.SelectByIndex(2);//Index starts from 0. so, 0 = Jr.High 1 = HighSchool 2 = College

Chọn theo giá trị:

SelectAnEducation.SelectByValue("College");//There are 3 values - Jr.High, HighSchool, College

2

Bạn chỉ cần chuyển giá trị và nhập khóa:

driver.FindElement(By.Name("education")).SendKeys("Jr.High"+Keys.Enter);

Có thể sẽ không thành công nếu trình đơn thả xuống chứa nhiều tùy chọn với các văn bản tương tự.
Antti

1

Đây là cách nó hoạt động đối với tôi (chọn điều khiển bằng ID và tùy chọn bằng văn bản):

protected void clickOptionInList(string listControlId, string optionText)
{
     driver.FindElement(By.XPath("//select[@id='"+ listControlId + "']/option[contains(.,'"+ optionText +"')]")).Click();
}

sử dụng:

clickOptionInList("ctl00_ContentPlaceHolder_lbxAllRoles", "Tester");

0

Nếu bạn chỉ đang tìm kiếm bất kỳ lựa chọn nào từ hộp thả xuống, tôi cũng thấy phương pháp "chọn theo chỉ mục" rất hữu ích.

if (IsElementPresent(By.XPath("//select[@id='Q43_0']")))
{
    new SelectElement(driver.FindElement(By.Id("Q43_0")))**.SelectByIndex(1);** // This is selecting first value of the drop-down list
    WaitForAjax();
    Thread.Sleep(3000);
}
else
{
     Console.WriteLine("Your comment here);
}

0
 var select = new SelectElement(elementX);
 select.MoveToElement(elementX).Build().Perform();

  var click = (
       from sel in select
       let value = "College"
       select value
       );

4
Vui lòng thêm giải thích cho mã của bạn: tại sao nó là câu trả lời cho câu hỏi và điều gì khiến nó khác với những câu trả lời đã cho trước đó?
Nander Speerstra

0
IWebElement element = _browserInstance.Driver.FindElement(By.XPath("//Select"));
IList<IWebElement> AllDropDownList = element.FindElements(By.XPath("//option"));
int DpListCount = AllDropDownList.Count;
for (int i = 0; i < DpListCount; i++)
{
    if (AllDropDownList[i].Text == "nnnnnnnnnnn")
    {
        AllDropDownList[i].Click();
        _browserInstance.ScreenCapture("nnnnnnnnnnnnnnnnnnnnnn");
    }
}

Hoạt động với các lựa chọn trong danh sách thả xuống
james
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.