2017-01-13 9 views
0

ドロップダウンリストで要素を選択しようとしています。私がSelenium C#のみを使用しようとしたとき、Divエラーが発生していました.jQueryを使用してselectを実行することをお勧めしました.Divエラーは要素が選択されていてdivだったはずです。私はsendkeyを使ってドロップダウンを選択しようとしましたが、その後、要素に焦点を当てることができないエラーが発生します。ドロップダウン値を選択できません:jQuery、C#、およびSelenium

私は現在、次のコードを持って、私はそれが動作して取得することはできないです:

using OpenQA.Selenium; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using NUnit.Framework; 
using OpenQA.Selenium.Chrome; 
using WebAuto; 
using System.Drawing.Imaging; 
using OpenQA.Selenium.Support.UI; 
using Selenium.WebDriver.Extensions.JQuery; 
using OpenQA.Selenium.Remote; 

namespace WebAuto 
{ 
    class AddTrade 
    { 
     [Test] 
     public static void AddTrade1() 
     { 
      var driver = new ChromeDriver(); 
      driver.Navigate().GoToUrl("webaddress"); 
      var inputtext1 = driver.FindElement(OpenQA.Selenium.By.Id("lgLogin_txtUserId")); 

      inputtext1.SendKeys("User"); 
      var inputpassword1 = driver.FindElement(OpenQA.Selenium.By.Id("lgLogin_txtPassword")); 

      inputpassword1.SendKeys("Password"); 
      var inputbutton1 = driver.FindElement(OpenQA.Selenium.By.Id("btnLoginClient")); 
      inputbutton1.Click(); 


      System.Threading.Thread.Sleep(3000); 
      driver.FindElement(OpenQA.Selenium.By.Id("s2id_selTrader")).Click(); 

      $("#s2id_selTrader").val("Main Trader"); 

はどうすればこの問題を解決することができますか?

+1

「Divエラー」とは何ですか?あなたの最初のアプローチが最初にうまくいかなかった理由を理解するために時間を割いておくことをお勧めします。これは、おそらくそれが対処されていない場合に別の方法であなたを悩ますために戻ってくる問題があることを示しているからです。あなたのページに同じIDを持つ複数の要素がありますか?要素の時間を許可するには、[WebDriverWait](https://seleniumhq.github.io/selenium/docs/api/dotnet/html/T_OpenQA_Selenium_Support_UI_WebDriverWait.htm)(* ThreadDleverWait.htmではありません)を使用する必要がありますか?負荷? – StriplingWarrior

+0

あなたの質問を簡単に説明するためにタイトルを書き直すことができます。リスト3の技術には、その質問の内容は記載されていません。 –

+0

@ StriplingWarrior:要素が選択されているはずでしたが、divだったエラーが発生しました – hthomas

答えて

1

Seleniumを使用してJavaScriptを実行するには、ドライバのIJavaScriptExecutorを使用する必要があります。たとえば:

((IJavaScriptExecutor)driver).ExecuteScript("$('.toTop').remove();"); 

しかし、私はそれがドロップダウンから項目を選択するための最良の方法であることを知りません。あなたはSelectElementとしての要素をキャストし、そのクラス内のいずれかの方法を使用してみました:

SelectElement select = new SelectElement(element); 

    select.SelectByValue("123"); 

SelectByTextとSelectByIndexもあります。

0

あなたは待機句を追加してみてくださいすることができます

wait = new WebDriverWait(driver, new TimeSpan(0, 0, 10)); 
if (!driver.FindElement(By.CssSelector("selector")).Displayed) 
{ 
    wait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.CssSelector("selector"))); 
    driver.FindElement(By.CssSelector("selector")).Text; // There are other properties and methods if you need 
} 
+0

Thanks Peter!感謝。 –

0

私は間違っていない場合は、これらの選択は、実際のHTML ではありません要素を(選択して、結果的に、あなたがセレンのSelectElementを使用することはできませんそれらを参照してください)、むしろあなたが異なってやり取りする必要があるスクリプト化されたdiv要素です。あなたは、実際のユーザーの体験を再現したい場合は

、あなたは条件に応じて、項目は全く見えにならない可能性があることに注意してください。この

public void SetDropdownValue(IWebElement dropdown, string value) 
    { 
     By valueXpath = By.XPath("//div[@id='select2-drop']//li[div[text()='" + value + "']]"); 
     dropdown.FindElement(By.XPath(".//b[@role='presentation']")).Click(); 

     new WebDriverWait(Driver, TimeSpan.FromSeconds(1)).Until(ExpectedConditions.ElementExists(valueXpath)); 
     Driver.FindElement(valueXpath).Click(); 
    } 

のようなものを試してみてください(それがスローされますElementNotVisibleException)、要素をクリックする前に要素を表示する必要があります。その場合は、hereのいずれかの方法を試して、その存在を確認した後に追加することができます。

また、私が提供した "valueXpath"モデルをチェックし、それがあなたのページのものと等しいかどうかを確認してください。 liには、代わりにの要素が含まれている場合があります。そのため、その中に目的のオプションテキストが含まれている要素を直接見つけなければなりません。

関連する問題