我遇到了一段代码异常。我的代码是将商品添加到袋子中,然后我要选择商品的数量。当我单击下拉菜单上的数量以选择2时。
我的代码在此行上引发异常:
IWebElement Qty = webDriver.FindElement(By.Id("bagApp"));
SelectElementFromDropDown(Qty, "2");
元素应该已经被选择,但是是div。
这段代码旨在单击下拉菜单。
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);
}
}
}
答案 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");