异常“元素应已选择但为div” C#硒

时间:2018-06-25 14:27:33

标签: c# selenium-webdriver

我遇到了一段代码异常。我的代码是将商品添加到袋子中,然后我要选择商品的数量。当我单击下拉菜单上的数量以选择2时。

我的代码在此行上引发异常:

IWebElement Qty = webDriver.FindElement(By.Id("bagApp"));
SelectElementFromDropDown(Qty, "2");
  

元素应该已经被选择,但是是div。

这段代码旨在单击下拉菜单。

Screenshot of inspect

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Interactions;
using System.Threading;

namespace Exercise1
{
    class Exercise3
    {

        static void Main()
        {
            IWebDriver webDriver = new ChromeDriver();


            webDriver.Navigate().GoToUrl("http://www.asos.com/men/");
            webDriver.Manage().Window.Maximize();

            webDriver.FindElement(By.XPath(".//input[@data-testid='search-input']")).SendKeys("nike trainers");

            webDriver.FindElement(By.XPath(".//button[@data-testid='search-button-inline']")).Click();

            WebDriverWait wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(5));
            IWebElement country = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("article img")));


            webDriver.FindElement(By.CssSelector("article img")).Click();


            IWebElement Size = webDriver.FindElement(By.XPath(".//select[@data-id='sizeSelect']"));
            SelectElementFromDropDown(Size, "UK 10.5 - EU 45.5 - US 11.5");


            webDriver.FindElement(By.XPath("//*[@data-bind='text: buttonText']")).Click();

            webDriver.FindElement(By.XPath("//a[@data-testid='bagIcon']")).Click();

            IWebElement Qty = webDriver.FindElement(By.Id("bagApp"));
            SelectElementFromDropDown(Qty, "2");

            webDriver.FindElement(By.XPath("//*[@data-bind='click: update']")).Click();

            //int trainer = 145;

            //while (trainer < 200){
            //    Console.WriteLine(trainer);
            //    trainer = trainer * 2;


            //}

            webDriver.Quit();
        }

        private static void SelectElementFromDropDown(IWebElement ele, string text)
        {
            SelectElement select = new SelectElement(ele);
            select.SelectByText(text);
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您的下拉列表由 divs spans 组成,在这种情况下,Select类无法为您提供帮助。

您可以尝试以下代码:

IList<IWebElement> options= webDriver.FindElements(By.CssSelector("li[class*='select2-results__option']"));  
foreach (IWebElement element in options){  
     if(element.GetText().Equals("2")){  

        element.Click();
    }
    }

请注意,在尝试从下拉列表中选择值之前,必须先单击向下箭头按钮,然后才能使用以下代码

webDriver.FindElement(By.CssSelector("span#select2-d2bx-container+span")).Click() 

在移至新页面进行此操作时,应使用显式等待。

答案 1 :(得分:0)

您可以如下选择网络元素

//Explicit wait is added to ensure that my bag item section is loaded successfully
WebDriverWait wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(5));
wait.Until(ExpectedConditions.ElementExists(By.XPath("//select[contains(@class,'bag-item-quantity')]")));

IWebElement qtyElement = webDriver.FindElement(By.XPath("//select[contains(@class,'bag-item-quantity')]"));
SelectElementFromDropDown(qtyElement,"2");

答案 2 :(得分:0)

发生错误是因为您在HTML元素上使用的SelectElement类不是SELECT,在这种情况下不是DIV

要选择所需的选项,您需要单击下拉列表以将其打开,然后从下拉列表中单击所需的选项。由于您可能会多次选择选项,因此最好将代码添加到函数中。

public void SelectOption(string s)
{
    new WebDriverWait(webDriver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector($"span[title='{s}']"))).Click();
}

然后称呼它

webDriver.FindElement(By.CssSelector("span.select2")).Click();
SelectOption("2");