2016-07-07 10 views
0

ドロップダウンリストからオプションを選択する際に、SeleniumWebdriverを使用しているときに問題があります。セレンを使用した選択

<span id="id14"> 
    <div class="stadium-input-row"> 
     <span class="inputContainer"> 
      <select id="id1f" class="departurePoint stadiumSelect" onchange="var wcall=.........."> 
      <option value="">Please select</option> 
      <option value="BHX"> Birmingham - (BHX) </option> 
      <option value="GLA"> Glasgow - (GLA) </option> 
      <option value="LON"> London - (LON) </option> 
      <option value="MAN"> Manchester - (MAN) </option>............ 

selectタグidは、DOMがロードされるたびに変更します。以下はHTMLスニペットです。

selectタグは、対話するまでグレー表示されています。

私のコード

Select oSelect = new Select(driver.findElement(By.xpath("(.//select)[1]")); 
oSelect.selectByVisibleText("Birmingham"); 

エラー

org.openqa.selenium.NoSuchElementExceptionは:テキストを持つ要素 を見つけることができません:デバッグモードでバーミンガム

、ドロップダウンはしていません運転手が起動(クリック)したようです。

+0

使用 '.selectByVisibleText( "バーミンガム - (BHX)");'私の提供私の作品answer..itとして...要素が表示されていないとして、これは動作しません –

+0

は申し訳ありません – Steerpike

+0

しかし、あなたの例外によると、セレブが見つかるようですが、提供されたテキストでオプションを選択できませんでした。 –

答えて

1

少なくとも私にとっては奇妙なことがあります。あなたがアクセスしようとしているSELECTは永久に隠されています(つまり、Seleniumを使って対話できません)。ユーザはDIVなどと偽のドロップダウン(SELECTではない)を介して対話し、その選択結果は隠されたSELECTに保存されます。あなたの仕事を達成するには2つの方法があります。

  1. あなたが見るものを扱う。

    これは本当にこのサイトの痛みです。私はそれが最終的に行われると思うが、私はそれ以上の時間を費やしたくないので、私はあなたにドアを見せてくれるだろう。以下のコードは、出発ドロップダウンを開きます。そこから、出発空港を見つけてそれをクリックします。完了しました。

    driver.findElement(By.cssSelector("div.custom-select.departurePoint.airportSelect")).click(); 
    
  2. チート...それよりも音ハーダーとJavascriptExecutorを使用しています。

    注:ユーザーは非表示の要素をクリックしたり、ページにJavascriptコマンドを挿入することができないため、これを実行することで実際のユーザーシナリオは実行されなくなります。あなたがこれでOKである限り、ここにサンプルがあります。

    このコードでは、JavascriptExecutorを使用してページ上でJavascriptを実行します。探している文字列をオプションに渡します(例:あなたは "EMA"または "East Midlands - (EMA)"またはどこかに渡すことができます。 JSコードは、隠しSELECTを取得し、OPTIONSを検索し、最初に一致するものを選択します。

    注:選択肢では、UIの更新は表示されません。 SEARCHをクリックすると動作します。私はそれを自分で試して、それは動作します。

    さらに別の注:私はエディタとしてEclipseを使用していますので、下のコードに表示されている// @formatter:offは、EclipseがJSコードを含む余分な長い文字列を折り返し/再フォーマットしないようにしています。あなたは好きなようにそれを残すか、または削除することができます。私はそれが好きです。なぜなら、私はそれがフォーマットされているようにインデントされたままのJSコードを読むことができるからです。そして、私はEclipseにそれを混乱させたくありません。

    selectOption("EMA"); 
    
    public void selectOption(String option) 
    { 
        // @formatter:off 
        String script = 
         "function selectOption(s) {\r\n" + 
         " var sel = document.querySelector('select.departurePoint.airportSelect');\r\n" + 
         " for (var i = 0; i < sel.options.length; i++)\r\n" + 
         " {\r\n" + 
         "  if (sel.options[i].text.indexOf(s) > -1)\r\n" + 
         "  {\r\n" + 
         "   sel.options[i].selected = true;\r\n" + 
         "   break;\r\n" + 
         "  }\r\n" + 
         " }\r\n" + 
         "}\r\n" + 
         "return selectOption('" + option + "');"; 
    
        // @formatter:on 
        ((JavascriptExecutor) driver).executeScript(script); 
    } 
    
+0

私はこのような質問との愛情/憎しみの関係があります。私はそれのパズルの側面が大好きですが、私は時々それらを理解するのにかかる時間が嫌いです。だから、あなたはこの500倍にアップアップして、それを答えとして受け入れ、私がこの1つで行ったすべての仕事のためにあなたの最初の誕生日をくれます...笑。 – JeffC

+0

私は長い間中断してこの問題に戻ります。あなたが提供したソリューション(Javascript Executor)*は機能していましたが、今は動作させることができません。おそらく私は間違ったCSSセレクタをコードに渡しているでしょうか?私はselect.selection-componentを渡していますが、これは正しいとは言えません。なぜなら、ページが 'Search'をクリックしてリフレッシュして検索を実行しないからです。これはhttps://www.club18-30.com/club18-30にあります – Steerpike

0

あなたexceptionは明らかにCannot locate element with text: Birminghamは、あなたが以下のようにしてみてくださいする必要がありますので、それは全体の表示テキストオプションを使用して比較し、言うように: -

WebDriverWait wait = new WebDriverWait(driver, 10); 
WebElement select = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(.//select)[1]"))); 
Select oSelect = new Select(select); 
oSelect.selectByVisibleText("Birmingham - (BHX)"); 

または

oSelect.selectByIndex(1); 

または

oSelect.selectByValue("BHX"); 

を編集: - If残念ながら、上記のソリューションのどれもあなたが以下のようにJavascriptExecutorを使用してみてください動作します: -

((JavascriptExecutor)driver).executeScript("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].text.indexOf(arguments[1]) != -1){ select.options[i].selected = true; } }", 
      driver.findElement(By.xpath("(.//select)[1]")), 
      "Birmingham"); 

はそれが..あなたを助けることを願っています:)

0

あなたが何をする必要があるか:

List<WebElement> options = driver.findElement(By.xpath("//div[@class='stadium-input-row']//select")).findElements(By.tagName("option")); 

ことWebElementオブジェクトとしてオプションタグのリストを作成します

または

Select oSelect = new Select(driver.findElement(By.xpath("//div[@class='stadium-input-row']//select")); 

か、単に要素

Actions action = new Actions(driver); 
WebElement hoverElement = driver.findElement(By.xpath("//div[@class='stadium-input-row']//select")); 
action.moveToElement(hoverElement); 
action.click().build().perform(); 
+0

最初の方法を使用すると、実際にはタグのリストが作成されます。なぜなら、デバッグするときにListの41個の要素を見ることができるからです。私が持っている問題は、Seleniumに要素を公開して、それと対話できるようにすることです。たとえば、私が:options.get(1).clickを実行しても、私はまだ各メソッドが提案されたままorg.openqa.selenium.ElementNotVisibleExceptionを取得します。 – Steerpike

+0

選択にホバーしようとした後、それと対話する - 私はコード –

+0

を追加します。ドロップダウンはホバー上ではなく、 – Steerpike

-1

をホバリングWebElementオブジェクトとして

WebElement selectElement = driver.findElement(By.xpath("//div[@class='stadium-input-row']//select")); 

を選択を取る選択は、すべての状況で動作しません。このコードを試してみてください

関連する問題