Selenuim / WatirのDevexpressコンボボックスをどのように自動化しますか? -- selenium フィールド と combobox フィールド と devexpress フィールド と watir フィールド 関連 問題

How do you automate DevExpress Combo Boxes with Selenuim/Watir?












1
vote

問題

日本語

Devexpressは非常に奇妙な方法でコンボボックスを構築します。 SelenuimとWatir(ページオブジェクトを含む)に内蔵されている標準の識別は、選択リストとして表示されません。 それでは、どのようにしてこれらを正常に自動化できますか?

英語

DevExpress builds combo boxes in a very odd way. The standard identification built in to Selenuim and Watir (including Page Objects) does not see it as a Select List. So how can you automate these successfully?

</div
           

回答リスト

1
 
vote
vote
ベストアンサー
 

それが判明したように、devexpressはそれに関連したいくつかの階層化テーブルを持つボックスとしてコンボボックスをビルドしますが、HTMLツリーのテキストボックスの下にはありません。 インタラクションはすべて組み込みスクリプトを介して行われます。

私はこのオブジェクトを自動化する最も簡単な方法を見つけました(3番目のテーブルダウン)、テキストボックスと最下位のテーブルを識別することです。

例えば(WatirとPage Objectsを使用)

<事前> <コード> table(:list,:id => 'ComboBoxValue_DDD_L_LBT') text_field(:state, :id => 'ComboBoxValue_I') #:name => 'State')

私はこれらのレベルでより良いIDを得る方法を見つけていませんが、その問題を働いています。 その後、選択コードは次のようになります。

<事前> <コード> self.state_element.click row = list_element.find { |row| row[0].text == value } row.click
 

So as it turns out, DevExpress builds combo boxes as a text box with several layered tables associated with it but not under the text box in the HTML tree. interactions are all done via embedded scripts.

I found the simplest way to automate this object is to identify the text box and the lowest table containing the list of items (3rd table down).

for example (using Watir and Page Objects)

table(:list,:id => 'ComboBoxValue_DDD_L_LBT') text_field(:state, :id => 'ComboBoxValue_I') #:name => 'State') 

I have not found a way to get better IDs at these levels, but we are working that issue. Then your select code looks like this:

self.state_element.click row = list_element.find { |row| row[0].text == value } row.click 
</div
 
 
0
 
vote

Seleniumでは、クライアントで任意のJavaScriptを実行してコントロールの状態を問い合わせて設定できます(クライアント側がコントロールに有効になっている場合)。これは、LocalEselectListという名前のコンボボックスから選択したテキストを抽出(そして設定)するために行ったことがあります:

<事前> <コード> // unit test code, c# [TestMethod] public void SomeTestMethod() { IWebDriver ff = new FirefoxDriver(); ff.Navigate().GoToUrl(homeUrl); // find the element as an iWebElement IWebElement localeBox = ff.FindElement(By.CssSelector("#localeSelectList")); Assert.IsTrue(localeBox.Enabled); // get the text from the control via javascript var locale = Util.GetControlText(ff, localeSelectList); Assert.IsTrue(locale == "English"); // set the text in the control via javascript Util.SetControlText(ff, localeSelectList, "German"); // verify the text was set locale = Util.GetControlText(ff, localeSelectList); Assert.IsTrue(locale == "German"); } // helper methods, Util class static public string GetControlText(IWebDriver driver, string controlName) { string script = string.Format("return {0}.GetText();", controlName); var controlText = ((IJavaScriptExecutor)driver).ExecuteScript(script); return controlText.ToString(); } static public void SetControlText(IWebDriver driver, string controlName, string controlText) { string script = string.Format("{0}.SetValue('{1}');", controlName, controlText); ((IJavaScriptExecutor)driver).ExecuteScript(script); }

これらのイベントのイベントハンドラを起動しないため、プリミティブ(クリック、キーストロークなど)を介して、拡張子がプリミティブハンドラの代わりに「ValueChanged」イベントを使用している場合は、それが原始ハンドラの代わりに拡張子を使用している場合は、同じにかなり近い。 また、次のように、クライアントサイドのJavaScriptを使用してjQuery / CSSセレクタとIDを使用して要素を見つけて返すことができます。

<事前> <コード> IWebElement element = (IWebElement) ((IJavaScriptExecutor)driver).ExecuteScript("return $('#.myElementId');")
 

Note that with Selenium, you can execute arbitrary javascript in the client to query and set the control's state (if the client-side is enabled for the control). Here's how I did so to extract (and set) the selected text from a combobox named localeSelectList:

// unit test code, c# [TestMethod] public void SomeTestMethod() {     IWebDriver ff = new FirefoxDriver();     ff.Navigate().GoToUrl(homeUrl);     // find the element as an iWebElement     IWebElement localeBox =  ff.FindElement(By.CssSelector("#localeSelectList"));     Assert.IsTrue(localeBox.Enabled);      // get the text from the control via javascript     var locale = Util.GetControlText(ff, localeSelectList);     Assert.IsTrue(locale == "English");     // set the text in the control via javascript     Util.SetControlText(ff, localeSelectList, "German");     // verify the text was set     locale = Util.GetControlText(ff, localeSelectList);     Assert.IsTrue(locale == "German"); }  // helper methods, Util class static public string GetControlText(IWebDriver driver, string controlName)    {        string script = string.Format("return {0}.GetText();", controlName);        var controlText = ((IJavaScriptExecutor)driver).ExecuteScript(script);        return controlText.ToString();    } static public void SetControlText(IWebDriver driver, string controlName, string controlText)    {        string script = string.Format("{0}.SetValue('{1}');", controlName, controlText);        ((IJavaScriptExecutor)driver).ExecuteScript(script);    } 

It's not quite the same thing as interacting with the extensions via primitives (clicks, keystrokes, etc) as it won't fire the event handlers for these events, but if your extension uses 'valueChanged' events instead of primitive handlers it's pretty close to the same. Also note: you can use client-side javascript to find and return elements using jquery/css selectors and ids, as follows:

IWebElement element = (IWebElement) ((IJavaScriptExecutor)driver).ExecuteScript("return $('#.myElementId');") 
</div
 
 
 
 
0
 
vote

それはいくつかの階層化されたテーブルを持つ正しいですが、ComboBoxがクリックされたときにのみ表示されていることを追加したいと思います。最初の

<事前> <コード> var cmbParameterGruppen = webDriver.FindElement(By.Id("phContent_ParameterGruppenComboBox_I")); cmbParameterGruppen.Click();

、その後

<事前> <コード> var tblItems = webDriver.FindElement(By.Id("phContent_ParameterGruppenComboBox_DDD_L_LBT")); var parameterGruppen = tblItems.FindElements(By.XPath(".//*")); var count = parameterGruppen.Count; Debug.WriteLine($"Count = {count}"); if(count > 0) parameterGruppen[count - 1].Click();

最後の行を選択します。

 

That's right with several layered tables, but I would like to add that they are only visible when combobox is clicked. First

            var cmbParameterGruppen = webDriver.FindElement(By.Id("phContent_ParameterGruppenComboBox_I"));             cmbParameterGruppen.Click(); 

and then

            var tblItems = webDriver.FindElement(By.Id("phContent_ParameterGruppenComboBox_DDD_L_LBT"));              var parameterGruppen = tblItems.FindElements(By.XPath(".//*"));             var count = parameterGruppen.Count;             Debug.WriteLine($"Count = {count}");             if(count > 0)                 parameterGruppen[count - 1].Click(); 

I select hier last row.

</div
 
 

関連する質問

1  Watir Ruby Unit TestsにサーバーURLを渡す方法ThountWorks Cruiseの下でRakeが実行する  ( How to pass server urls to watir ruby unit tests run by rake under thoughtworks ) 
現在、私の.NET Webアプリケーションのための一連のWATIRテストを構築しています。 rakeを使ってWatir TestsをInterworksクルーズ連続ビルドに有線です。 多くの異なる環境に対してテストを実行できるように、Watirテストに多...

-1  Rubyループ質問[閉じた]  ( Ruby loop question ) 
この質問は将来の訪問者を助けることはほとんどありません。それは、小さな地理的地域、特定の瞬間、またはインターネットの世界的な聴衆に一般的に適用されない非常に狭い状況に関連しています。この...

5  Mozilla Firefoxの好みを変えるWatir  ( Watir changing mozilla firefox preferences ) 
WATIRを使用してRubyスクリプトを実行しています。特定のディレクトリに自動的にファイルを保存しようとしています。それで、私のMozillaの設定では、デスクトップをデスクトップしてファイルを自動的に保存することを選択して選択します。 これらの変更は、ス...

0  Watir :: wait.untilはフレームで動作していません  ( Watirwait until not working with frames ) 
WATIRを使用して、フレーム付きのRifeである内部ツールを自動化しています。私はすべてのさまざまな要素を操作することができるので、私はフレームを正しく識別していることを知っていますが、私がこれらの要素のいずれにも待つことを試みるときはいつでも失敗しました...

2  IDまたは名前がないテーブルを見つける方法  ( How to locate the table which doesnt have id or name ) 
テーブルを見つけてからTRとTDを見つける必要がありますが、テーブル IDと名前がありませんので、テーブルを見つける方法知っている 索引を使用する必要がありますが、残念ながらそれはうまくいきません。 ページには10個のテーブルがあります。 テーブルの行の「Re...

1  誰もがDOMをナビゲートするためのLI UL TDのようなHTMLタグを使用してWatirの使用をカバーする詳細なドキュメンテーションの場所を知っていますか?  ( Does anyone know the location of detailed documentation covering the use of wati ) 
次のコードから予期しない結果が発生しました。 私は-list-値を取得しています - 1つのiターゲットの後に位置しています。 "employee_error_list"を使って その応答がコンテンツに限定されないのはなぜですか -unordered-lis...

-1  WATIRを使用してHTMLを使用してリンクをクリックするにはどうすればよいですか  ( How can i click a link using its html with watir ) 
私はこのようなリンクを持っています: <事前> <コード> #searchButton2 <コード> #searchButton3 。を使用してクリックしたいです。 ...

1  フォーム情報が入力されている場合は、[送信]ボタンをクリックすることはできません  ( Cannot click submit button if form information is inputted ) 
RubyとWatirを使って、フォームに記入した後に送信ボタンをクリックするためにページを自動化しようとしています。 これはボタンのHTMLコードです。 <事前> <コード> <div class="btns_wr"> <span class="small_...

2  Woritirのファイルを自動ダウンロードします  ( Auto download files in watir ) 
リンクを自動的にダウンロードする方法は、リンクを「保存」やその他のウィンドウを使用せずに、リンクをクリックしてください。私はそれをOSに依存しないようにしようとしているので、Win32ole Gemを使用することには興味がないでしょう。 ...

0  AUTOITを使用して保存ダイアログを操作します  ( Using autoit to manipulate save dialogs ) 
ルビースクリプトで自動的に使用しようとしています。スクリプトはファイルの保存プロンプトに正常になり、実際にファイルをダウンロードする方法が必要です。 問題の少なくとも問題は、私が見つけた例は非常に一般的であり、具体的な例に関連しない傾向があるということです。こ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有