จะเลือกตัวเลือกจากดรอปดาวน์โดยใช้ Selenium WebDriver C # ได้อย่างไร?


87

ฉันพยายามทดสอบเว็บโดยเลือกตัวเลือก ดูตัวอย่างได้ที่นี่: http://www.tizag.com/phpT/examples/formex.php

ทุกอย่างใช้งานได้ดียกเว้นการเลือกส่วนตัวเลือก จะเลือกตัวเลือกตามค่าหรือตามป้ายได้อย่างไร?

รหัสของฉัน:

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

        }
}

คำตอบ:


188

คุณต้องสร้างวัตถุองค์ประกอบที่เลือกจากรายการแบบเลื่อนลง

 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");

ข้อมูลเพิ่มเติมที่นี่


มีจุดบกพร่อง var selectElement = new SelectElement(education);ควรจะเป็น:var selectElement = new SelectElement(element);
Greg Gauthier

52
FYI: ในการใช้ Select Element คุณต้องรวมแพ็คเกจ Selenium Webdriver Support ซึ่งเป็นแพ็คเกจ NuGet ที่แตกต่างจาก Selenium WebDriver รวมเนมสเปซ OpenQA.Selenium.Support.UI
James Lawruk

ฉันใช้ไดรเวอร์ firefox ซีลีเนียมเวอร์ชัน 2.53.1 และรองรับไลบรารี 2.53 ดูเหมือนว่า SelectByText จะไม่ทำงาน ฉันสามารถเห็นตัวเลือกทั้งหมด แม้ว่าฉันจะวนซ้ำตัวเลือกและตั้งค่าที่ถูกต้อง แต่ค่าก็ยังไม่ได้รับการตั้งค่า .. ความช่วยเหลือใด ๆ จะดีมาก
Viswas Menon

3
คุณลองใช้ไดรเวอร์อื่นหรือแค่ Firefox? นอกจากนี้ชื่อทางเทคนิคของแพ็คเกจปัจจุบันคือ Selenium การสนับสนุน
Dan Csharpster

สิ่งนี้ใช้ได้ผลดีสำหรับฉันต้องเพิ่มซีลีเนียมสนับสนุน NuGet ด้วย
Ray K

13

เพิ่มประเด็นนี้ - ฉันพบปัญหาที่ OpenQA.Selenium.Support.UI namespace ไม่พร้อมใช้งานหลังจากติดตั้ง Selenium.NET ที่เชื่อมโยงกับโครงการ C # พบในภายหลังว่าเราสามารถติดตั้ง Selenium WebDriver Support Classes เวอร์ชันล่าสุดได้อย่างง่ายดายโดยใช้คำสั่ง:

Install-Package Selenium.Support

ใน NuGet Package Manager Console หรือติดตั้ง Selenium การสนับสนุนจาก NuGet Manager


9

วิธีอื่นอาจเป็นวิธีนี้:

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

และคุณสามารถเปลี่ยนดัชนีในตัวเลือก [x] เปลี่ยน x ตามจำนวนองค์ประกอบที่คุณต้องการเลือก

ฉันไม่รู้ว่าเป็นวิธีที่ดีที่สุดหรือเปล่า แต่หวังว่าจะช่วยคุณได้


ฉันไม่แน่ใจว่าจะใช้ได้ตลอดเวลา มีคนทำแบบนี้และมันไม่ได้ผลและฉันต้องเปลี่ยนเป็นรหัสเป็นรหัสที่ Matthew Lock แนะนำ
Fractal

3

ในการเลือกตัวเลือกผ่านข้อความ

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

ในการเลือกตัวเลือกผ่านค่า:

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

3

รหัส Selenium WebDriver C # สำหรับเลือกรายการจากรายการแบบหล่นลง:

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

มี 3 วิธีในการเลือกรายการแบบเลื่อนลง: i) เลือกตามข้อความ ii) เลือกตามดัชนี iii) เลือกตามค่า

เลือกตามข้อความ:

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

เลือกตามดัชนี:

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

เลือกตามมูลค่า:

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

2

คุณเพียงแค่ต้องส่งค่าและป้อนรหัส:

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

อาจจะล้มเหลวหากเมนูแบบเลื่อนลงมีหลายตัวเลือกที่มีข้อความคล้ายกัน
Antti

1

นี่คือวิธีการทำงานสำหรับฉัน (เลือก control by ID และ option by text):

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

ใช้:

clickOptionInList("ctl00_ContentPlaceHolder_lbxAllRoles", "Tester");

0

หากคุณกำลังมองหาเพียงตัวเลือกใด ๆ จากช่องแบบเลื่อนลงฉันพบว่าวิธี "เลือกตามดัชนี" มีประโยชน์มาก

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
โปรดเพิ่มคำอธิบายให้กับรหัสของคุณ: เหตุใดจึงเป็นคำตอบสำหรับคำถามและอะไรทำให้แตกต่างจากคำตอบก่อนหน้านี้
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");
    }
}

ใช้งานได้กับการเลือกแบบเลื่อนลง
เจมส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.