2

これは私を夢中にさせています。私は使用してみましBy.Id or By.Xpathたが、何も機能しません。Select Method

//テストコード

 SelectMyText(By.XPath("//*[@id='ctl00_ContentPlaceHolder1_ddlCategory']"), "Employee");

//方法:

     public void SelectMyText(By locator, string valueToBeSelected)
    {
        var options = GetElementId(locator).FindElements(By.TagName("option"));
        foreach (var option in options)
        {
            if (valueToBeSelected == option.Text)
            {
                option.Click();
                return;
            }
        }
    }

    public IWebElement GetElementId(By locator)
    {
        return Driver.FindElement(locator);
    }

取得するエラーは次のとおりです。

threw exception: 
System.NotImplementedException: Element is no longer valid
    at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
    at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
    at OpenQA.Selenium.Remote.RemoteWebDriver.InternalExecute(String driverCommandToExecute, Dictionary`2 parameters)
    at OpenQA.Selenium.Remote.RemoteWebElement.Execute(String commandToExecute, Dictionary`2 parameters)
    at OpenQA.Selenium.Remote.RemoteWebElement.get_Text()

このエラーのスクリーンショットは次のとおりです。

ここに画像の説明を入力 ここに画像の説明を入力

4

2 に答える 2

2

さて、あなたの質問は、ドロップダウンからオプションを選択することがどのように可能であるかという質問のカテゴリーからのものです。私は通常2つのアプローチを使用します: アプローチ1(アクションビルダー、高度なユーザーアクションAPIを使用):

WebElement mnuElement;
WebElement submnuElement;
mnEle = driver.findElement(By.Id("mnEle")).click();
sbEle = driver.findElement(By.Id("sbEle")).click();

Actions builder = new Actions(driver);
// Move cursor to the Main Menu Element
builder.MoveToElement(mnEle).perform();
// Giving 5 Secs for submenu to be displayed
Thread.sleep(5000L);
// Clicking on the Hidden SubMenu
driver.findElement(By.Id("sbEle")).click()

; あなたがここで得ることができるいくつかの追加情報

2番目のアプローチ(jsを直接使用):

String cssSelector =..blablabla...
JavascriptExecutor js = (JavascriptExecutor) driver;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("var x = $(\'"+cssSelector+"\');");
        stringBuilder.append("x.click();");
        js.executeScript(stringBuilder.toString());

これがあなたのために働くことを願っています)

于 2012-09-15T14:50:11.880 に答える
2

アイデアは非常に単純です。要素にアクセスできない、見えないなどの疑いがある場合は、js を使用してごまかすことができます) したがって、次のようにいくつかのメソッドがあります。

public void  clickOnTheElement(String cssLocator){
JavascriptExecutor js = (JavascriptExecutor) driver;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("var x = $(\'"+cssLocator+"\');");
        stringBuilder.append("x.click();");
        js.executeScript(stringBuilder.toString());

}

public String getTextOfTheElement(String cssLocator)
{ JavascriptExecutor js = (JavascriptExecutor) driver;
        StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append("var x = $(\""+cssLocator+"\");");
        stringBuilder.append("return x.text().toString();")       ;


       String res= (String) js.executeScript(stringBuilder.toString());
       return res;
}

//getElementProperty e.g. color

public String jsGetColor(String css){

        JavascriptExecutor js = (JavascriptExecutor) driver;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("var x=$(\'"+css+"\');");
        stringBuilder.append("return x.css('color')");
        String res= (String) js.executeScript(stringBuilder.toString());
        return res;

    }

//SO the only thing remains: you have to find css locator of the element you want to interact //with(get property, click on or get text) and pass it to appropriate function:
String myCssLocatorOfTheElement=..blablabla..;
String color=jsGetColor(myCssLocatorOfTheElement);
String text=getTextOfTheElement(myCssLocatorOfTheElement);
 clickOnTheElement(myCssLocatorOfTheElement);

これがお役に立てば幸いです)

于 2012-09-19T10:58:37.517 に答える