selenium IDE での条件式について

3,302 views
Skip to first unread message

ひげのパパ

unread,
Aug 25, 2018, 5:20:53 AM8/25/18
to 日本Seleniumユーザーコミュニティ
selenium IDE が 3.2.0 にバージョンアップされて、
他のアドオンを追加したりせずに
if ~ else ~ や repeat if といった条件判定による分岐やループが可能となったようなのですが、
記述方法について書かれたドキュメントが見当たらず、
条件式をどのように書いたらいいのかよくわかりません。

やりたいことは、ファイルのアップロードで時間がかかる処理があって、
処理完了の文字列が表示されるまで待つということです。

現状は、余計に長く pause して、終了を待っているのですが、
1回の pause は短くして、文字列を変数に入れ、
その変数が所定の文字列でなければ、pause に戻るという流れを考えています。

具体的には、以下のような設定で試しました。

Command          Target                              Value
--------------------+--------------------------------+--------------
do
pause                1000
store text           css=p                              TEXT
repeat if             ${TEXT}!="FINISH"

これを実行すると、repeat if の行で以下のようなエラーとなってしまいます。

Failed: Invalid or unexpected token

比較演算子を == や <> など、いくつか 試したのですが、ダメでした。

Command          Target                              Value
--------------------+--------------------------------+--------------
if                        ${TEXT}!="FINISH"

とした場合は、
Failed: Unexpected token {
となります。


一方で、
Command          Target                              Value
--------------------+--------------------------------+--------------
repeat if             "FINISH"                          ${TEXT}

としてみたところ、シンタックス的にはエラーにならず repeat するのですが、
${TEXT} の値と判定しているわけではなく、
Value 欄の記述を削除しても、適当な文字列を記載してもループする状態です。

#単なる文字列が 真 と見なされているのでしょうか。

変数と文字列が一致しない場合にループするという処理はどのように書けばよろしいのでしょうか?

戸田広

unread,
Aug 25, 2018, 11:10:20 PM8/25/18
to 日本Seleniumユーザーコミュニティ
まだ公式ではドキュメントもサンプルコードもありませんが、
/packages/selenium-ide/src/neo/models/Command.js の記述から、
フィールド「target」「value」の中に何を設定すれば良いのか参考にできます。
「repeat if」も「if」も、条件式としてJavaScriptコードを記載可能なのはフィールド「target」だけです。
また、store系コマンドで生成した変数は、JavaScriptコード内では単純にインライン展開されますので、
文字列として比較したい場合は、インライン展開された後の姿を考えてクォーテーションマークでくくる必要があります。

つまり、次のようにしてください。

Command          Target                              Value
--------------------+--------------------------------+--------------
if                        "${TEXT}" != "FINISH"



2018年8月25日土曜日 18時20分53秒 UTC+9 ひげのパパ:

ひげのパパ

unread,
Aug 26, 2018, 3:27:21 AM8/26/18
to 日本Seleniumユーザーコミュニティ
戸田様

早速のご回答ありがとうございます。

おかげさまでご教授していただいた記述方法で
期待通りのループ処理が実施できました。

ありがとうございました。

2018年8月26日日曜日 12時10分20秒 UTC+9 戸田広:

戸田広

unread,
Aug 30, 2018, 11:52:54 PM8/30/18
to 日本Seleniumユーザーコミュニティ
すみません、本日リリースされました最新バージョン 3.3.0 で、
お伝えしていた状態から大きく変わってしまいました。


> また、store系コマンドで生成した変数は、JavaScriptコード内では単純にインライン展開されますので、
> 文字列として比較したい場合は、インライン展開された後の姿を考えてクォーテーションマークでくくる必要があります。

ここの動作が変わって、インライン展開の際に変数の型を自動的に判断して
必要に応じてクォーテーションマークが追加されるようになりました。
このため、v3.3.0からは、

Command          Target                              Value
--------------------+--------------------------------+--------------
if                        ${TEXT} != "FINISH"

こう書くのが正しくなります。
お試しください。


2018年8月26日日曜日 16時27分21秒 UTC+9 ひげのパパ:

ひげのパパ

unread,
Dec 15, 2018, 4:35:16 AM12/15/18
to 日本Seleniumユーザーコミュニティ
おかげさまで通常の条件式においては、期待通りの動作をするようになったのですが、
変数に \ を複数含む Windows のファイルパス名の文字列を設定した場合、
if 文の箇所で
  Unexpected token S in JSON at position 5
といったエラーになってしまいます。

やりたかったことは、変数のファイルパス名が空文字列かどうかを判定したかったのですが、
何か解決策、回避策等ありますでしょうか?

ちなみに \ を含む文字列を設定した変数は、ファイルパス名としては期待通りの動作をしています。

2018年8月31日金曜日 12時52分54秒 UTC+9 戸田広:
Reply all
Reply to author
Forward
0 new messages