【问题标题】:how to select the value of oi-select in selenium webdriver如何在 selenium webdriver 中选择 oi-select 的值
【发布时间】:2017-10-27 10:38:40
【问题描述】:

我正在编写一个脚本来自动化我的表单提交。使用 webdriver 代码,我可以将数据添加到除 oi-select 之外的所有 html 输入。

我的 HTML DOM:

<oi-select class="multiSelect ng-pristine ng-empty ng-invalid ng-invalid-required multiple ng-touched" ng-if="to.key==null" oi-options="item for item in to.options" ng-model="model[options.key]" required="true" multiple="" id="formly_1_estoreMultiselect_category_0" name="formly_1_estoreMultiselect_category_0" formly-custom-validation="" ng-keyup="options.templateOptions['onKeyup'](model[options.key], options, this, $event)" ng-focus="options.templateOptions['onFocus'](model[options.key], options, this, $event)" ng-blur="options.templateOptions['onBlur'](model[options.key], options, this, $event)" type="estoreMultiselect" style="">
    <div class="select-search">
        <ul class="select-search-list">
            <!---->
            <li class="select-search-list-item select-search-list-item_input" ng-class="{'select-search-list-item_hide': inputHide}">
                <input autocomplete="off" ng-model="query" ng-keyup="keyUp($event)" ng-keydown="keyDown($event)" class="ng-pristine ng-valid ng-empty ng-touched" placeholder="" style="">
            </li>
            <li class="select-search-list-item select-search-list-item_loader ng-hide" ng-show="showLoader">
            </li>
        </ul>
    </div>
    <div class="select-dropdown ng-hide" ng-show="isOpen">
    <!---->
    </div>
</oi-select>

这是我使用 Selenium WebDriver 获取它的代码:

driver.findElement(By.id("formly_1_estoreMultiselect_category_0")).clear();
driver.findElement(By.id("formly_1_estoreMultiselect_category_0")).sendKeys("Networking");

这是抛出的异常:

org.openqa.selenium.InvalidElementStateException: 
    Element must be user-editable in order to clear it.

如何向oi-select 添加值?

【问题讨论】:

  • 错误是说您的元素不可编辑。如果它是一个输入标签,你可以做 sendkeys 所以尝试使用 xpath 像//input[@class='ng-pristine ng-valid ng-empty ng-touched']
  • 一些我如何能够弄清楚如何发送值但它的选择字段现在没有输入问题是在发送值之后..基于它执行 LDAP 搜索给出了一个值选项 i必须选择进入下拉列表。如果它是选择字段但我的是 oi-select 则非常容易...从 oi-select 选项中如何选择第一个值
  • 如果可能的话,你能分享一下网址吗?如果您的选择是在发送文本后出现,请使用以下代码。并再次找到您所期望的第一个元素

标签: java angularjs selenium selenium-webdriver webdriver


【解决方案1】:

错误是说您的“元素不可编辑”,因为您将文本发送到 div 而它应该是 input

所以在这里,为了处理io-select 标签元素,我有下面的参考代码

public class Test {

    public static WebDriver driver;


    public static void main(String[] args) throws InterruptedException 
    {

        System.setProperty("webdriver.chrome.driver","Resources/chromedriver.exe"); 
        driver = new ChromeDriver();    
        driver.manage().window().maximize();
        driver.get("http://embed.plnkr.co/OYcetkAmDd21zhhToCC9/");
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        driver.switchTo().frame(0).switchTo().frame(0);
        driver.findElement(By.xpath("//li/input[@class='ng-pristine ng-untouched ng-valid']")).sendKeys("boots");
       driver.findElement(By.xpath("//ul/li[contains(.,'boots')]")).click();

    }
}

所以在你的情况下你的元素是//input[@class='ng-pristine ng-valid ng-empty ng-touched']

driver.findElement(By.xpath("//input[@class='ng-pristine ng-valid ng-empty ng-touched']").sendKeys("yourText");

【讨论】:

  • 我已经更新了示例代码。希望这对你有帮助
  • 我正在尝试使用相同的代码@Naren,但它给出了这个异常 org.openqa.selenium.NoSuchElementException: Unable to locate element: //input[@class='ng-pristine ng-valid ng-空 ng-touched']
  • Hay Naren 我试过下面的代码 driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[12]/div/div/div[2] ]/div/div/div[3]/span/ng-form/div[2]/ng-form/div[1]/span[1]/oi-select/div[1]/ul/li[1 ]/input")).sendKeys("网络"); driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[12]/div/div/div[2]/div/div/div[3]/span/ng -form/div[2]/ng-form/div[1]/span[1]/oi-select/div[1]/ul/li[contains(.,'Networking')]")).click( );
  • 我能够发送数据,但我无法在下拉列表中选择显示网络的值,但是在选择它的抛出异常时,就像没有这样的元素..我不确定是什么问题
【解决方案2】:

我将使用:http://embed.plnkr.co/OYcetkAmDd21zhhToCC9/Plunker。

创建类和构造函数

让我们首先为OISelect 创建一个类,该类接受By 类型的定位器和WebDriver 对象。

public class OISelect {

    By locator;
    WebDriver driver;
    WebDriverWait wait;

    public OISelect(By locator, WebDriver driver) {
        this.locator = locator;
        this.driver = driver;
        wait = new WebDriverWait(driver, 3);
    }
}

创建辅助函数

我们需要执行较小的功能,例如定位单个和网络元素列表:

/**
 * Return a web element
 * @param locator
 * @return
 */
private WebElement getWebElement(By locator) {
    return wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(locator)).get(0);
}

/**
 * Return a list of web elements
 * @param locator
 * @return
 */
private List<WebElement> getWebElements(By locator) {
    return wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(locator));
}

/**
 * Return the search input text box
 * @return
 */
private WebElement getSearchInputTextbox() {
    return getWebElement(By.xpath("//*[contains(@class,'select-search-list-item_input')]//input"));
}

/**
 * Return the list item matching option name
 * @param opionName
 * @return
 */
private WebElement getOption(String opionName) {
    return getWebElement(By.xpath("//*[contains(@class,'select-dropdown-optgroup-option')]"));
}

创建动作执行者

现在我们需要定义可以在oi-select 上执行的步骤/操作,例如搜索项目名称、选择项目、验证结果是否显示、验证项目是否被选中等。

/**
 * Search an item name
 * 
 * @param itemName
 * @return
 */
public boolean searchItem(String itemName) {
    // Set text
    getSearchInputTextbox().sendKeys(itemName);
    // Verify text has been set
    boolean flag = getSearchInputTextbox().getAttribute("value").equalsIgnoreCase(itemName);
    System.out.println("Search text has been set to " + itemName + "? " + flag);
    return flag;
}

/**
 * Select an item name
 * 
 * @param itemName
 * @return
 */
public boolean selectItem(String itemName) {
    if (hasResults()) {
        getOption(itemName).click();
    }
    return isSelected(itemName);
}

/**
 * Verify if an item name is selected
 * 
 * @param itemName
 * @return
 */
public boolean isSelected(String itemName) {
    boolean isSelected = false;
    // Get list of all selected items
    List<WebElement> allItems = getWebElements(By.xpath(".//*[contains(@class,'select-search-list-item_selection')]"));
    // Iterate through each item to match expected item name
    for (WebElement item : allItems) {
        // Match item name 
        isSelected = item.getText().trim().contains(itemName);
        if (isSelected) {
            break; // Exit loop if matching item name exists
        }
    }
    System.out.println(itemName + " is selected? " + isSelected);
    return isSelected;
}

/**
 * Verify search results are displayed
 * 
 * @return
 */
public boolean hasResults() {
    boolean flag = getWebElement(By.xpath(".//*[contains(@class,'select-dropdown') and not(contains(@class,'ng-hide'))]")) != null;
    System.out.println("Results are displayed? " + flag);
    return flag;
}

最后是测试以上所有的主要方法

public static void main(String[] args) {

    // Load driver and url
    WebDriver driver = new ChromeDriver();
    String url = "http://embed.plnkr.co/OYcetkAmDd21zhhToCC9/";
    try {
        driver.get(url);
        WebElement frameElement = driver.findElement(By.className("plunker-space-iframe"));
        driver.switchTo().frame(frameElement).switchTo().frame("preview");

        // Select item
        OISelect select = new OISelect(By.tagName("oi-select"), driver);
        String itemName = "sneakers";
        select.searchItem(itemName);
        select.hasResults();
        select.selectItem(itemName);

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        driver.quit();
    }
}

【讨论】:

  • 嗨 Zeeshan 我试过代码仍然是同样的问题。我正在使用波纹管代码 driver.findElement(By.id("formly_1_input_title_0")).clear(); driver.findElement(By.id("formly_1_input_title_0")).sendKeys("RTool"); driver.findElement(By.id("formly_1_input_toolName_1")).clear(); driver.findElement(By.id("formly_1_input_toolName_1")).sendKeys("RTool");
  • 虽然指向简单的输入字段,但我可以填充数据,但是当涉及到 OI-select By.id 时不起作用,所以我使用的是 xpath 。你提到的那个 By.xpath("//*[contains(@class,'select-search-list-item_input')]//input") 这没有给出这样的元素异常它以某种方式寻找完整的xpath跨度>
  • driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[12]/div/div/div[2]/div/div/ div[3]/span/ng-form/div[2]/ng-form/div[1]/span[1]/oi-select/div[1]/ul/li[1]/input")) .sendKeys("网络");通过我的 div 的完整路径后,这工作正常。之后我可以看到下拉列表中过滤了一个值
  • 选择我正在使用 driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[12]/div/div/div[2] ]/div/div/div[3]/span/ng-form/div[2]/ng-form/div[1]/span[1]/oi-select/div[1]/ul/li[1 ]/input[contains(text(),'Networking')]")).click();它抛出了同样的异常没有找到这样的元素
猜你喜欢
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多