selenium 使用Selify WebDriver处理Select2

7fyelxc5  于 2022-11-10  发布在  其他
关注(0)|答案(8)|浏览(188)

我一直在拼命地试着从一个启用了AJAX的selt2选择列表中选择一个选项。我设法让它与IE网络驱动程序一起工作,但不能与Firefox一起工作。以下是我针对IE的老套解决方案

public static void SetSelect2Option(this IWebDriver driver, By locator, string subContainerClass, string searchTerm, TimeSpan? ajaxWaitTimeSpan = null)
    {
        var select2Product = driver.FindElement(locator);
        select2Product.Click();
        var searchBox = driver.FindElement(By.CssSelector(subContainerClass + " .select2-input"));
        searchBox.SendKeys(searchTerm);
        if (ajaxWaitTimeSpan != null)
        {
            driver.Manage().Timeouts().ImplicitlyWait(ajaxWaitTimeSpan.Value);
        }
        var selectedItem = driver.FindElements(By.CssSelector(subContainerClass + " .select2-results li")).First();
        selectedItem.Click();
        selectedItem.SendKeys(Keys.Enter);
    }

在Firefox中,这个解决方案一直运行到SendKeys调用的时候,它只是挂起并继续下一步,而不实际触发selt2的事件来填充所选的项。
我也厌倦了使用http://code.google.com/p/selenium/wiki/AdvancedUserInteractions API,也得到了类似的结果。
以前有没有人遇到过类似的问题?

z0qdvdin

z0qdvdin1#

你能把定位器也给我们看看吗?这是我测试过的,没有任何问题。

注意事项

1.要打开选择框,请使用css选择器#s2id_e1 .select2-choice或等效的XPath。
1.通过css选择器#select2-drop:not([style*='display: none'])或等效的XPath,确保#select2-drop是可见的。
1.确保使用subContainerClass+.select2-results li.select2-result-selectable或等效的XPath单击可选项目。

var driver = new FirefoxDriver();
driver.Url = "http://ivaynberg.github.io/select2/";

var select2Product = driver.FindElement(By.CssSelector("#s2id_e1 .select2-choice"));
select2Product.Click();

string subContainerClass = "#select2-drop:not([style*='display: none'])";
var searchBox = driver.FindElement(By.CssSelector(subContainerClass + " .select2-input"));
searchBox.SendKeys("Ohio");

var selectedItem = driver.FindElements(By.CssSelector(subContainerClass + " .select2-results li.select2-result-selectable")).First();
selectedItem.Click();
bxgwgixi

bxgwgixi2#

我花了一些时间让它在FF、Chrome和IE8-11上运行。
1.点击下拉箭头
1.点击所需的li
以下是我的简化代码:

[FindsBy(How = How.ClassName, Using = "select2-arrow")]
private IWebElement Selector { get; set; }

private void selectItem(string itemText)
{
    Selector.Click();  // open the drop
    var drop = Driver.FindElement(By.Id("select2-drop"));    // exists when open only
    var item = drop.FindElement(By.XPath(String.Format("//li[contains(translate(., '{0}', '{1}'), '{1}')]", itemText.ToUpper(), itemText.ToLower())));
    item.Click();
}
pxiryf3j

pxiryf3j3#

我使用下面的代码来选择所需的选项,它起作用了。这也必须比执行多次点击更快。

String script = "$('select#yearSelector').trigger($.Event('change',{val:'" + year + "'}))";
((JavascriptExecutor) driver).executeScript(script);

而且,在Python中,如果这一行程序不起作用,可以尝试将其拆分成其组件:

value = ['a', 'b', 'c']
 script = "var elem = $('select#tradingMarketSelect'); "
 script += "elem.val(%s); " % value
 script += "elem.change();"
 self.driver.execute_script(script)
7xzttuei

7xzttuei4#

以下是我的代码(获取/显示):
正在获取select2个可用元素(结果):

public List<WebElement> getDataFromSelect2(String elementXpath)
{       
    WebElement select2Element = driver.findElement(By.xpath(elementXpath));
    select2Element.click();     

    WebDriverWait webDriverWait = new WebDriverWait(driver, 90);
    webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//ul[@class='select2-results']//div")));

    WebElement select2ElementResults=driver.findElement(By.xpath("//div[@id='select2-drop']/ul[@class='select2-results']"));
    List<WebElement> selectResultsAsListCollection = select2ElementResults.findElements(By.tagName("div"));

    return selectResultsAsListCollection; 
}

显示select2可用元素(结果)
使用ID为:s2id_autogen1select2

List<WebElement> select2Results = getDataFromSelect2("//input[@id='s2id_autogen1']");

for(WebElement item: select2Results)
{
    System.out.println(item.getText());
}
goucqfw6

goucqfw65#

这里有一个可靠的、可重用的解决方案,它可以处理在一个页面上与多个selt2下拉菜单交互的额外问题。
出于某种原因,即使您可以在屏幕上看到搜索值并且光标在其中,WebDriver也不会将要向其发送搜索值的元素视为可见。这就是“如果显示”测试要检查的内容。然后它使用不同的选择器。
它是一个函数,您可以发送想要与之交互的字段的ID(减去标准的s2id_)和要选择的值(或至少足够的值来进行选择)。
额外的thread.sky()只是为了帮助我观看它。我不认为他们会影响结果。

public void SelectDropDownOption(string dropDownID, string option)
    {
        for (int second = 0; ; second++)
        {
            if (second >= 60) Assert.Fail("timeout");
            try
            {
                if (driver.FindElement(By.CssSelector("div[ID^=s2id_" + dropDownID + "]>a.select2-choice")).Displayed) break;
            }
            catch (Exception)
            { }
            Thread.Sleep(1000);
        }

        driver.FindElement(By.CssSelector("div[ID^=s2id_" + dropDownID + "]>a.select2-choice")).Click();
        Thread.Sleep(1000);

        if (driver.FindElement(By.CssSelector("input.select2-input.select2-focused")).Displayed == true)
        {
            driver.FindElement(By.CssSelector("input.select2-input.select2-focused")).SendKeys(option);
            Thread.Sleep(500);
            driver.FindElement(By.CssSelector("input.select2-input.select2-focused")).SendKeys(Keys.Enter);
            Thread.Sleep(500);
        }
        else
        {
            driver.FindElement(By.CssSelector("input.select2-focusser.select2-offscreen")).SendKeys(option);
            Thread.Sleep(500);
            driver.FindElement(By.CssSelector("input.select2-focusser.select2-offscreen")).SendKeys(Keys.Enter);
            Thread.Sleep(500);
        }

    }
vcirk6k6

vcirk6k66#

protected void SelectOptionForSelect2(IWebDriver driver, string id, string text)
{
  var element = driver.FindElement(By.Id(id)).FindElement(By.XPath("following-sibling::*[1]"));
  element.Click();

  element = driver.FindElement(By.CssSelector("input[type=search]"));
  element.SendKeys(text);

  Thread.Sleep(1000);
  element.SendKeys(Keys.Enter);
}
fcy6dtqo

fcy6dtqo7#

尝试选择WebDRIVER Java脚本执行。下面是一个方便的C#方法。

// usings
using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

// method
public static void SetSelect2Option_JSExample(this IWebDriver driver, string select2Id, string value)
{       
    IJavaScriptExecutor jsExecutor = (IJavaScriptExecutor)driver;
    string js = "$('#" + select2Id + "').val('" + value + "').trigger('change');";
    string jsOutput = (string)jsExecutor.ExecuteScript(js);
}
woobm2wo

woobm2wo8#

对于2022年的读者来说...使用SelectElement Class与selt2的交互:(CSharp)

IWebElement select2Element = _webDriver.FindElement(By.Id("select2"));

var select2 = new SelectElement(select2Element);

select2.SelectByText("foo");

//example of getting an item from the list
var selectOptions= select2.Options.Select(x => x.Text).ToList();

相关问题