117398
UWSC 仮 掲示板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオン
動作不具合での質問の場合には環境を表記(OS,バージョン等)
タイトルは内容を表し、内容はネットゲーム関係禁止
自身でコードを書く気の無いナマケモノは特に質問禁止
失敗作でもコードを投稿すること(具体性の無い質問は無視される可能性大)

UWSC掲示板 が復活することを祈り、それまでの繋ぎとして。
環境設定[s7777777]

(No Subject) / sen
お世話になっております。
csvからcsvへの転記したいのですが、もう少し早くなる方法はありませんでしょうか?
以前教えて頂いたfindstrとdoscmdを組み合わせた方法でやっているのですが、4分ぐらい掛かります。

ご教授お願いします。


dim f = "余剰梱包.csv"

GETTIME()
print G_TIME_NN+" "+G_TIME_SS+" スタート"

在庫転記(f)

GETTIME()
print G_TIME_NN+" "+G_TIME_SS+" 終了"

PROCEDURE 在庫転記(f)
  ex = fopen(f,F_READ or F_WRITE)
   For p = fget(ex,-1) TO 3 STEP -1
    抽出 = fopen("temp.csv", f_write)
     fput(抽出, trim(doscmd("findstr <#dbl>" + trim(fget(ex,p,1)) + "<#dbl> 在庫.CSV")))
    fclose(抽出)

    id = fopen("temp.csv")
      For i = 1 to fget(id,F_LINECOUNT)
       ifb trim(fget(ex,p,1)) = trim(fget(id,i,10)) then
        fput(ex,trim(fget(id,i,23)),p,14)
        fput(ex,trim(fget(id,i,25)),p,15)
         break
       endif
      next
    fclose(id)
   next
  fclose(ex)
fend

//余剰梱包.csv //2439行
//梱包,削減,予備,帳簿,21/11/06,機種,追加,引当,在庫2F,種類,状況,待ち,当,フリー,引当,上棚7★,待ち棚7,差棚7,S_,T_
//aaaa,0,0,0,ブラケット,,,,,,,0,0,0,0,0,0,0,,
//bbbb,0,0,2,ブヒンバコ,,,2020/5/11,,,部品箱,1,1,5,0,0,1,0,,

//在庫.CSV //1474行
//一覧表,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
//倉庫,倉庫名称,荷主,荷主名称,1,2,3,4,5,コード,名称,規格1,規格2,規格3,規格4,No,数量1,数量1荷姿名称,数量2,数量2荷姿名称,数量3,数量3荷姿名称,在庫数,移動中数,引当数,出荷止数,重量,容積,基準日,出荷許容日,賞味期限切れ
//110,e,1,t,1,,,,,aaaa,1ダン2ガタ タナイタ1200,,,,,,4,個,0,,0,,4,0,0,0,4,4,,,
//110,e,1,t,1,,,,,bbbb,1ダン2ガタ タナイタ1500,,,,,,1,個,0,,0,,1,0,0,0,1,1,,,
//110,e,1,t,1,,,,,cccc,1ダン2ガタ ワク2ホン,,,,,,4,個,

//結果
//40 12 スタート
//43 55 終了

No.1398 2021/11/07(Sun) 08:54:15

Re: / stuncloud
こちらで作成したサンプルCSVファイルでの結果は以下となりました

dim f = "余剰梱包.csv"
s = GETTIME()
在庫転記(f)
print (GETTIME() - s) + "秒" // 約80秒
s = GETTIME()
在庫転記fixed(f, "在庫.CSV")
print (GETTIME() - s) + "秒" // 約50秒

極力ファイルの読み書きを減らすために配列を使いましたが思ったほど早くならないですね…
splitを使うのでCSV内にダブルクォートや余計なカンマがあると正常動作しなくなるという弱点もあります

例: ほげ,"ふ,が",ぴよ
  csv的には ほげ ふ,が ぴよ になってほしいが ほげ "ふ が" ぴよ の4要素になってしまう

procedure 在庫転記fixed(余剰梱包, 在庫, outfile = EMPTY)
 fid = fopen(余剰梱包, F_READ)
 A余剰梱包 = split(fget(fid, F_ALLTEXT), "<#CR>")
 fclose(fid)
 fid = fopen(在庫, F_READ)
 A在庫 = split(fget(fid, F_ALLTEXT), "<#CR>")
 fclose(fid)

 for i = length(A余剰梱包) - 1 to 2 step -1
  余剰梱包行 = split(A余剰梱包[i], ",", false, false)
  for row in A在庫
   在庫行 = split(row, ",")
   if trim(在庫行[9]) = trim(余剰梱包行[0]) then
    余剰梱包行[13] = trim(在庫行[22])
    余剰梱包行[14] = trim(在庫行[24])
    break
   EndIf
  next
  A余剰梱包[i] = join(余剰梱包行, ",")
 next
 if outfile = EMPTY then
  outfile = 余剰梱包
 endif
 fid = fopen(outfile, F_WRITE)
 fput(fid, join(A余剰梱包, "<#CR>"))
 fclose(fid)
fend

ともあれCSVファイルがそこまで巨大なのであればCSVではなくデータベースを使ったほうが良い気がします
(UWSCからでもデータベースを扱う方法はあります)

あるいはExcelでLOOKUP系の関数などを使えば簡単に望んだ結果が得られそうです
Excel処理の自動化(CSV取り込み、数式埋め込みなど)はVBAでもUWSCでもできますしね

No.1399 2021/11/08(Mon) 12:20:21

Re: / By(バイ)
senさんこんにちは。

 なぜ余剰梱包.csvを逆読みで、しかも3行目までしか読まないのか不思議でしたが、そのままにしてます。

 以下の方法ではどうでしょうか?
 私の環境では秒殺でした。(^_^)V

//----------------------------------------
dim f = "余剰梱包.csv"

GETTIME()
print G_TIME_NN+" "+G_TIME_SS+" スタート"

在庫転記_改(f)

GETTIME()
print G_TIME_NN+" "+G_TIME_SS+" 終了"

Procedure 在庫転記_改(f)
  Hashtbl 在庫数
  fid = Fopen("在庫.CSV", F_READ)
  For i = 2 To Fget(fid, F_LINECOUNT)
   If 在庫数[Fget(fid, i, 10), HASH_EXISTS] Then Continue
   在庫数[Fget(fid, i, 10)] = trim(Fget(fid, i, 23)) + "," + trim(Fget(fid, i, 25))
  Next
  Fclose(fid)
  
  ex = fopen(f,F_READ or F_WRITE)
   For p = fget(ex,-1) TO 3 STEP -1
    If 在庫数[fget(ex, p, 1), HASH_EXISTS] Then
     数 = Split(在庫数[fget(ex, p, 1)], ",")
     fput(ex, 数[0], p, 14)
     fput(ex, 数[1], p, 15)
    Endif
   next
  fclose(ex)
fend

No.1400 2021/11/10(Wed) 19:03:58

Re: / sen
stuncloudさん、Byさん、ありがとうございます。

連想配列の方は、秒殺でした。
以前、Linersさんにも教えて頂いたりしたのを思い出します。
少し変わると、うまく使えなくて恥ずかしい限りです。
でも転記がこんなに早いと、使わないとダメですね。

本当に、ありがとうございました。

No.1406 2021/11/15(Mon) 00:42:39
UwscWebDriver(MS Edge)ダイアログのボタンを押したいですが... / nyoshikawa
UwscWebDriverをありがたく使用させていただいております。
UWSCのIE版をMS Edge版に焼き直しているところです。

# 質問

(UwscWebDriver-MS Edge)
MS EdgeのWeb上での自動入力の処理の中で、

接続している計測機器のデータ取得のため、[実測]ボタンをクリックし、通信アプリが立ち上がります。
ただ、このボタンをクリックする度に、下記の様なダイアログが表示され、画面遷移が中断されてしまいます。

-------------------------------------------------------------
このファイルを開きますか?

・・(サイト名略)・・からのMeganetTracer.applicatioを開きますか?

  [開く] [キャンセル]
-------------------------------------------------------------

このダイアログの中の「開く」をクリックするにはどうすればよいでしょうか?

<実測ボタンのHTML>
<button type="button" style="margin-right:30px;" onclick="out_ext2('./ClickOnce/MeganetTracer.application?ACTION=trace&LANGUAGE_TYPE=ja&TRACER_PORT=COM10')" >実測</button>


# 実行したコード

szTEXT = driver.GetDialogText()
MSGBOX("*" + szTEXT + "*")

MSGBOX("開きます")
driver.AcceptDialog()

MSGBOX("閉じます")
driver.DismissDialog()

# うまく行かない点

1.driver.GetDialogText() は空文字""でした。("**")

2.driver.AcceptDialog()
3.driver.DismissDialog() ともに反応がありませんでした。

お忙しいとは思いますが、どうぞよろしくお願いいたします。

No.1401 2021/11/13(Sat) 02:01:50

Re: UwscWebDriver(MS Edge)ダイアログのボタンを押したいですが... / stuncloud
まず、誤解があるようなのでそこを訂正します
> MSGBOX("開きます")
> driver.AcceptDialog()
>
> MSGBOX("閉じます")
> driver.DismissDialog()

AcceptDialogはダイアログを開くための関数ではなくダイアログのOKを押したのと同等の動作を行うものです
DismissDialogはダイアログを閉じるための関数ではなくダイアログのキャンセルと押したのと同等の動作を行うものです

そして次に状況の確認です
> 下記の様なダイアログ
はconfirmダイアログではなく、動的なHTMLで描画されたもの(以下疑似ダイアログ)ではありませんか?
AcceptDialog/DismissDialogはJavaScriptのalert、confirm、prompt等で表示されたダイアログを処理するための関数です
疑似ダイアログに対しては無効です
おそらく今回のケースは後者なのだと思われます

ですので、対処法は以下のようになると思われます
1. 「このファイルを開きますか?」が開かれている状態でF12の開発者ツールを開く
2. 疑似ダイアログ上の「開く」ボタンを特定しFindElementする
3. 「開く」ボタンのエレメントでClick()を実行

No.1402 2021/11/13(Sat) 11:09:26

Re: UwscWebDriver(MS Edge)ダイアログのボタンを押したいですが... / nyoshikawa
stuncloudさま コメント、大変ありがとうございます。


> まず、誤解があるようなのでそこを訂正します
> > MSGBOX("開きます")
> > driver.AcceptDialog()
> >
> > MSGBOX("閉じます")
> > driver.DismissDialog()
> AcceptDialogはダイアログを開くための関数ではなくダイアログのOKを押したのと同等の動作を行うものです
> DismissDialogはダイアログを閉じるための関数ではなくダイアログのキャンセルと押したのと同等の動作を行うものです


わかりにくい説明で済みません。
MSGBOX("開きます") MSGBOX("閉じます") はブレークポイントのつもりでした。
開いてしまったダイアログには、[開く]と[キャンセル]の2つボタンがあり、これを
driver.AcceptDialog() 、driver.DismissDialog() でコントロールできるかなと
思ってしまいました。


> ですので、対処法は以下のようになると思われます
> 1. 「このファイルを開きますか?」が開かれている状態でF12の開発者ツールを開く
> 2. 疑似ダイアログ上の「開く」ボタンを特定しFindElementする
> 3. 「開く」ボタンのエレメントでClick()を実行


1.でF12の開発者ツールを開き、
2.疑似ダイアログ上の「開く」ボタンを特定できるか試してみましたが、
ダイアログ状態のHTML全ソースを見ても見当たりませんでした。

ところが、ダメモトで、昔のウィンドウ・アイテムのクロールツールで調べてみると、

szTITLE = "***ウィンドウタイトル**"
wid = GETID(szTITLE)
CLKITEM(wid , "開く" , CLK_ACC )

というコードですんなりと、「開く」を押すことができました。

結果オーライなのですが、

計測時の[実測ボタン]をクリックした後の問題のダイアログは

onclick="out_ext2('./ClickOnce/MeganetTracer.application?ACTION=trace&LANGUAGE_TYPE=ja&TRACER_PORT=COM10')"

で呼び出されるた後に表示される流れですが、
それが、stuncloudさまのおっしゃっている「動的なHTMLで描画されたもの(以下疑似ダイアログ)」
というものなのかどうか...まだよくわかっていません。

「動的なHTMLで描画されたもの(以下疑似ダイアログ)」はF12の開発者ツールで見る事ができるという事だとすれば
自分の探し方がまだまだ未熟なのかなとも思います。

ひとまず、前に進めそうなので良かったでした。

ご相談に乗って頂きたいへんありがとうございました。<(_ _)>

No.1403 2021/11/13(Sat) 22:15:59

Re: UwscWebDriver(MS Edge)ダイアログのボタンを押したいですが... / stuncloud
> onclick="out_ext2('./ClickOnce/MeganetTracer.application?ACTION=trace&LANGUAGE_TYPE=ja&TRACER_PORT=COM10')"
すいません、この部分をよく見ていませんでした
これによりブラウザの外でなにかを起動しているみたい?ですね?
であれば
> szTITLE = "***ウィンドウタイトル**"
> wid = GETID(szTITLE)
> CLKITEM(wid , "開く" , CLK_ACC )

も納得です、むしろこの方法が正解になると思います

ブラウザ内で完結しているものであるという先入観がありあのような提案になってしまいましたが、それ以外の可能性に思い至らなかったためにいらぬ混乱を与えてしまい申し訳あれませんでした

> 「動的なHTMLで描画されたもの(以下疑似ダイアログ)」はF12の開発者ツールで見る事ができるという事だとすれば
最近はalertなどのダイアログは使わず疑似ダイアログ的なものを描画するほうが良いという風潮があるようなので、そのようないわゆるWebアプリ的なものでは開発者ツールを駆使して自動操作の足がかりとしています
> 自分の探し方がまだまだ未熟なのかなとも思います。
今回はそういうものではなかったので探しても見つからないのは当然でした
徒労になってしまい重ね重ねお詫びします

No.1404 2021/11/14(Sun) 00:54:44

Re: UwscWebDriver(MS Edge)ダイアログのボタンを押したいですが... / nyoshikawa
> > onclick="out_ext2('./ClickOnce/MeganetTracer.application?ACTION=trace&LANGUAGE_TYPE=ja&TRACER_PORT=COM10')"
> すいません、この部分をよく見ていませんでした
> これによりブラウザの外でなにかを起動しているみたい?ですね?
> であれば
> > szTITLE = "***ウィンドウタイトル**"
> > wid = GETID(szTITLE)
> > CLKITEM(wid , "開く" , CLK_ACC )
> も納得です、むしろこの方法が正解になると思います



レス有難うございます。

結果オーライの暗中模索..不安モードでしたが、
今回のstuncloudさまのお墨付きが頂けて安心できました。<(_ _)>

問題のダイアログが、計測アプリが起動時に発しているダイアログか、
(疑似ダイアログか)何かのかがわからなかったのと、

ダイアログ表示の時点ではダイアログがモーダル状態で、
右クリックによる開発ツールが開けず、
[F12]キーで確認するというヒントを頂けて大変助かりました。

(にわかにEdge触りだしたところで開発ツールは右クリックしかり知りませんでした)

以降も同様なメッセージが出そうな箇所がありこの方法で切り抜けられそうです。


> 今回はそういうものではなかったので探しても見つからないのは当然でした
> 徒労になってしまい重ね重ねお詫びします


とんでもございません。何かあったらIE同様「F12」を押せ、がわかった
だけでも大変な収穫、ありがとうございます。


今後ともどうぞよろしくお願いいたします。

No.1405 2021/11/14(Sun) 12:58:29
UwscWebDriverでIEGETSRC等を使用してcntをインクリメントする方法 / yuupapa
管理人様お忙しい所失礼致します。

IEからChromeに変更して作業を行っているのですが、分からない箇所がありましたので大変恐縮ですが質問をさせてください。


----------------------
●質問
----------------------
WHILE IEGetSrc等でcntをインクリメントしていた方法をChromeで実現したいのですが、どのようにすればいいのでしょうか?


-------------
IEの場合
-------------
cnt=2

WHILE IEGETDATA(IE,"TAG=a",cnt) <> EMPTY
body = IEGetSrc(IE, "TAG=a",cnt)
body = BETWEENSTR(body,"<a href=<#DBL>/users/read/","/<#DBL> target=<#DBL>_blank<#DBL>")

PRINT body
PRINT "---"

CNT = CNT + 1

----------------------
●試したコード
----------------------

cnt=2

 WHILE CNT <> EMPTY

 body =driver.GetSource()

 body = BETWEENSTR(body,"<a href=<#DBL>/users/read/","/<#DBL> target=<#DBL>_blank<#DBL>")

 print body

 CNT = CNT + 1

 WEND


お忙しい所大変恐縮ですがご教授頂けると幸いです。

No.1395 2021/11/06(Sat) 19:25:04

Re: UwscWebDriverでIEGETSRC等を使用してcntをインクリメントする方法 / stuncloud
いまいち要件がわからないのですが、こういうことでしょうか

・Aタグ
・hrefが/users/read/で始まる
・targetが_blank
・以上の条件を満たすものがあればCNTを増やす

そうであった場合は以下のような方法が考えられます

まずソースに対してbetweenstrを行うパターンでやってみましょう

body =driver.GetSource() // ソースの取得
cnt = 0
while true
 b = BETWEENSTR(body,"<a href=<#DBL>/users/read/","/<#DBL> target=<#DBL>_blank<#DBL>", cnt + 1, TRUE)
 if length(b) > 0 then
  // betweenstrで文字が取れた=該当するaタグがあった
  // なのでcntを1増やす
  cnt = cnt + 1
 else
  break // 該当するものがなくなったのでwhileを抜ける
 endif
wend
msgbox(cnt)

という感じになるでしょうか
いささか冗長な感じですが狙い通りの数を得られそうです

次にもっとUwscWebDriverっぽいやり方で数えてみましょう

// aタグでhrefが /users/read/ から始まりtargetが_blankのエレメントをすべて探す
elems = driver.FindElements("a[href^=<#DBL>/users/read/<#DBL>][target=<#DBL>_blank<#DBL>]")
// 見つかったエレメントの数を数える
cnt = length(elems)
msgbox(cnt)

これならわずか2行で済みますね
ここからhrefの値を列挙したいなら

for elem in elems
 print elem.GetAttribute("href")
next

のように出来ます

No.1396 2021/11/06(Sat) 20:26:40

Re: UwscWebDriverでIEGETSRC等を使用してcntをインクリメントする方法 / yuupapa
管理人様

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

こちらの言葉足らずで説明不足になり申し訳ございません。

私が行いたかったのは下記になります。

-------------------------
?@hrefが/users/read/で始まるエレメントがいくつあるか

?Ahrefの値を全て列挙したい
-------------------------

管理人様から回答頂いた内容で解決することが出来ました!

非常に有難く思っております。

また、この方法は他の作業にも応用できるので大変ありがたい回答を頂いたと思っております。

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

No.1397 2021/11/06(Sat) 23:59:37
appref-msのソフトを開きたい / sen
お世話になっております。
拡張子がappref-msのソフトをexecで開きたいのですが、うまくいきません。
難しいのでしょうか?

よろしくお願い申し上げます。

No.1387 2021/10/25(Mon) 22:12:55

Re: appref-msのソフトを開きたい / stuncloud
shell = createoleobj("Shell.Application")
shell.ShellExecute("hoge.appref-ms")

でどうでしょうか? (hogeの部分を適宜置き換えてください)

あとはWin+Rでファイル名を指定して実行を出してそこにappref-msファイルのパスを入力するといった方法が使えるかもしれません

No.1388 2021/10/25(Mon) 22:44:53

Re: appref-msのソフトを開きたい / sen
お世話になっております。

下記の方法をやってみたのですが、実行ファイルのフォルダは開きましたが、
ソフトは立ち上がりません。どうなのでしょうか?


>shell = createoleobj("Shell.Application")
>shell.ShellExecute("hoge.appref-ms")

No.1389 2021/10/28(Thu) 23:12:06

Re: appref-msのソフトを開きたい / stuncloud
だめでしたか
appref-msというファイルに明るくない(恥ずかしながら初耳でした)ので、軽く調べてみたところどうやらそのファイルを叩くとその先でなんやかんやされた結果プロセスが起動するという仕組みらしい?ということがわかり、ではshellからの実行なら動くのでは?と予測したことからの提案でした

該当するソフトウェアがわかれば手元でも試せるんですが、Windows標準であったりするのでしょうか?

No.1390 2021/10/29(Fri) 00:21:29

Re: appref-msのソフトを開きたい / レフト
doscmd("hoge.appref-ms") でいかがでしょうか。

もしくは一旦uwscを介さずにアプリケーションを起動し、
タスクマネージャーで当該アプリケーションのパスを確認する。
そのパスに対して直接たたきにいけばexecでも起動すると思います。

No.1391 2021/10/29(Fri) 11:46:42

Re: appref-msのソフトを開きたい / sen
ありがとうございます。

Windows標準ではないんです。

>該当するソフトウェアがわかれば手元でも試せるんですが、Windows標準であったりするのでしょうか?

明日やってみます。

>doscmd("hoge.appref-ms") でいかがでしょうか。

No.1392 2021/10/29(Fri) 22:04:45

Re: appref-msのソフトを開きたい / stuncloud
なるほどClickOnce
いやまぁClickOnceもよくわかってないんですけど

こちらの環境ではappref-msはClickOnceに関連付けられているようではあります
そもそもの話なのですが、appref-msをダブルクリックした場合などは期待通りに動作するんですか?そこが動かないならUWSCからなにいかやっても動かないと思います

ClickOnceのローダー?がdfsvc.exeらしいので
exec("path\to\dfsvc.exe hoge.appref-ms")
とやれば動くかもしれないですがdfsvc.exeがどこにあるのかはわかりませんでした

ClickOnce的にappref-msを直接叩くという運用はアリなの?みたいなとこもよくわかりませんし、やろうとしていることが間違っているという可能性はありませんか?

No.1393 2021/10/30(Sat) 11:21:42

Re: appref-msのソフトを開きたい / sen
お世話になっております。

doscmd("hoge.appref-ms")で望み通り、ソフトが立ち上がりました。

stuncloudさん、レフトさん、色々と調べてもらいありがとうございました。

No.1394 2021/10/30(Sat) 22:01:37
UwscWebDriverでIEGETSRCやIEGETDATA / 太田
そろそろIEからの移行を計画している者です。
UwscWebDriverでIEGETSRCやIEGETDATA相当の事は出来ますでしょうか?
cgiページから各種データ取得したいと考えております。

No.1384 2021/10/18(Mon) 12:28:35

Re: UwscWebDriverでIEGETSRCやIEGETDATA / stuncloud
できます
具体的な使用方法についてはwikiをご参照ください
https://github.com/stuncloud/UwscWebDriver/wiki

No.1385 2021/10/18(Mon) 13:45:27

Re: UwscWebDriverでIEGETSRCやIEGETDATA / 太田
ありがとうございます。
戻り値 = driver.GetSource()
ですね、試してみます。助かります!!

No.1386 2021/10/18(Mon) 20:14:42
UwscWebDriver.uws で変数の定義設定[DIM]付加のお願い / ahqiao
UWSCの[OPTION EXPLICIT]構文後に[CALL UwscWebDriver.uws]を入れると、約50個ほどの変数が[定義していない]のメッセージが発生する。
最初にVer-0.7.1の時に気付いて、Ver-0.7.2のVersion-Upがあったので、切り替えた時も同様でした。Version-Upのたびに個別で[DIM]を追加しなければなりません。またVer-0.7.3もUpされていますが、私はまだUpしていません。
どうか[UwscWebDriver.uws]内に全変数の[DIM]付加をお願い出来ないでしょうか?
(OS=Win7, 32bit / UWSC=Free Ver-5.3.0.2)

No.1380 2021/10/04(Mon) 15:43:28

Re: UwscWebDriver.uws で変数の定義設定[DIM]付加のお願い / stuncloud
対応します
https://github.com/stuncloud/UwscWebDriver/issues/14

No.1381 2021/10/04(Mon) 16:17:58

Re: UwscWebDriver.uws で変数の定義設定[DIM]付加のお願い / stuncloud
0.7.4にて対応しました
https://github.com/stuncloud/UwscWebDriver/releases/tag/0.7.4

No.1382 2021/10/05(Tue) 11:39:31

Re: UwscWebDriver.uws で変数の定義設定[DIM]付加のお願い / ahqiao
Ver 0.7.4 をUpしました。有難うございました。
No.1383 2021/10/09(Sat) 12:32:44
セレクタで文字がクリックできない / みつ
お世話になります。
IE から EDGE に UwscWebDriver を使用して移行を始めたのですが、
クリックする方法が分からない箇所がありましたのでご教授をお願いできますでしょうか。


# 質問

driver.FindElement("body > form > table:nth-child(4) > tbody > tr:nth-child(7) > td:nth-child(2) > font > b").CLICK()
または
driver.FindElementByXPath("/html/body/form/table[2]/tbody/tr[7]/td[2]/font/b").CLICK()

でクリックしたいのですが、クリックができません。
どのようにすればクリックできるようになるか教えて頂けないでしょうか。


# 目的

IE でクリックしていた箇所を EDGE で UwscWebDriver を使用しクリックを再現したいです。


# 実行したコード

call UwscWebDriver.uws //UwscWebDriver-0.7.2
driver = WebDriver.ChromiumEdge() //バージョン 94.0.992.31 (公式ビルド) (64 ビット)
driver.Navigate("https://xxx")

//?@
driver.FindElement("body > font > center:nth-child(6) > font > font").Click() ←ここは動く、これをクリックすると次の画面に遷移する

//?A
driver.FindElement("body > form > table:nth-child(4) > tbody > tr:nth-child(7) > td:nth-child(2) > font > b").CLICK() ←動かない
または
driver.FindElementByXPath("/html/body/form/table[2]/tbody/tr[7]/td[2]/font/b").CLICK() ←動かない



//開発者ツールでは以下の <b>JAPAN</b> 要素になります。

▶<head>...</head>
▼<frameset cols="175px,*">
▼#document
▼<html>
▶<head>...</head>
▶<body background="images/214.jpg" link="black" vlink="black" alink="black" oncontextmenu="return false">
▼<form name="form1">
▶<head>...</head>
▶<table cellspacing="0" cellpadding="0" width="150" height="60" border="1">
▼<table cellspacing="0" cellpadding="0" border="0">
▼<tbody><tr>
▶<tr>...</tr>
▶<tr>...</tr>
▶<tr>...</tr>
▶<tr>...</tr>
▶<tr>...</tr>
▶<tr>...</tr>
▼<tr>
▶<td nowrap="">...</td>
▼<td nowrap=""                           onmouseover="this.style.backgroundColor='Gold'" onmouseout="this.style.backgroundColor=''"
style="cursor: pointer;" onclick="parent.menu.location.href='menu.asp?GP=A'">
▼<font size="2">
  
<b>JAPAN</b> ←-------ここの文字をクリックしたい
</font>
         </td>
         以下省略


# うまく行かない点

?Aの両方試しましたが、どちらも COM エラーで止まってしまいます。


また、?@から?Aに遷移した時に以下のエラーがたまにでるのですが、エラー原因と回避方法が分かりましたら
ご教授頂けますでしょうか。
三回に一回ぐらいの割合でエラーになります。

「申し訳ございません。このページに到達できませんhttps://xxx の Web ページに問題が発生しているか、新しい Web アドレスに完全に移動された可能性があります。
ERR_UNEXPECTED」



お手数をお掛けしますが、よろしくお願い致します。

No.1369 2021/09/25(Sat) 12:53:06

Re: セレクタで文字がクリックできない / stuncloud
そもそもb要素がクリックに反応しないのが原因ではないかと思います
onclickがtdにあるので、b要素ではなく親のtd要素をクリックしてみてください

driver.FindElement("body > form > table:nth-child(4) > tbody > tr:nth-child(7) > td:nth-child(2)").CLICK()


エラーに関してはわかりません
?@と?Aのクリック処理の前にsleep()を入れるなどして様子を見てください
捜査対象が社内Webページ等でしたらその管理者にエラー内容を伝え相談してください

No.1370 2021/09/25(Sat) 14:57:49

Re: セレクタで文字がクリックできない / みつ
>onclickがtdにあるので、b要素ではなく親のtd要素をクリックしてみてください

driver.FindElement("body > form > table:nth-child(4) > tbody > tr:nth-child(7) > td:nth-child(2)").CLICK()
を試しましたができませんでした。

上記の selector 部は、開発者ツールの selector コピーで取得したものですが、よく確認すると該当ページの要素は左側 <frame src="menu.asp" name="menu"> と
右側 <frame src="default.asp" name="main"> の frame に分かれているので、正しくは以下かと思い試しましたがダメでした。

driver.FindElement("html > frameset > frame:nth-child(1) > html > body > form > table:nth-child(4) > tbody > tr:nth-child(7) > td:nth-child(2)").CLICK()



他の方の質問で stuncloudさんが No.1356 2021/09/05(Sun) 23:38:40 で以下のように回答されているのを見つけたのですがこの frame にあたるのでしょうか。


>そして気になった点
>> IE.document.frames("main").document.forms[0].username.value = cUserName
>を見るにframeを使ったページのようですね
>上で基本的に、と書きましたが例外もあり、frame操作は例外になります
>需要がなかろうということでframe対応をしていなかったためです
>(これはまあ、僕が機能を実装すれば出来るようになるんですが…)
>とは言えframe内のページを(URL直指定で)個別に開けばいくらでも操作可能ではあります




>捜査対象が社内Webページ等でしたらその管理者にエラー内容を伝え相談してください

社内Webなので管理者に確認してみます。
よく分かりますね。
なぜ社内Webだと分かるのですか?

No.1371 2021/09/26(Sun) 10:32:30

Re: セレクタで文字がクリックできない / stuncloud
> この frame にあたるのでしょうか。
そうです、近年ではframeが使われることがそもそもない(使用が推奨されない)ので未対応のままでした
対応を検討します

現状でどうにする方法もなくはないです
frame内ページも個別にURLがあるのでそれをnavigate()を使って別タブで開き操作する、という回避手段が使える場合があります
本来開かれるframeの名前で別タブを開けばほかのframeからの操作もそちらに反映されるような気がするんですよね
例えばframe1でボタン押下→frame2にページ展開
みたいな作りならframe2のフリをした別タブを作る、という発想です
(frame2の名前は変更しておく必要があります)
名前というのはnavigate()の第二引数に渡すもので、window.nameのことでもあります
targetの仕組みを逆手に取ってこちらの都合の良いようにするという話…なんですが説明難しいですね

> なぜ社内Webだと分かるのですか?
frame同様fontタグやbタグは過去の遺物なので使われるとしたらそういうところかな、という推理です

No.1372 2021/09/26(Sun) 12:12:18

Re: セレクタで文字がクリックできない / みつ
早速のご返信ありがとうございます。


>対応を検討します

心強いお言葉ありがとうございます。
是非、ご検討をお願い致します。


>frame内ページも個別にURLがあるのでそれをnavigate()を使って別タブで開き操作する、という回避手段が使える場合があります
>本来開かれるframeの名前で別タブを開けばほかのframeからの操作もそちらに反映されるような気がするんですよね


こちらも試してみます。


>frame同様fontタグやbタグは過去の遺物なので使われるとしたらそういうところかな、という推理です

さすがです。

いつも的確なご回答ありがとうございます。
まずは、freme を別タブで navigate() する方法を試してみます。

No.1373 2021/09/26(Sun) 14:35:02

Re: セレクタで文字がクリックできない / stuncloud
一応対応してみました
https://github.com/stuncloud/UwscWebDriver/wiki/driver%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88#switchframe
とりあえずAPIがあったので叩けるようにしたものです

1つ目のフレームは driver.SwitchFrame(0)
2つ目のフレームは driver.SwitchFrame(1)

といった感じで指定すれば良さそう…なんですがこちらで2つのフレームを持つページを作ってテストしたところ2つ目しか操作できませんでした
調査不足でよくわかりません
使えたら御の字くらいの気持ちでご利用ください

# そもそもFrame自体が非推奨なのでこの程度の対応になります、ご了承ください

No.1374 2021/09/26(Sun) 15:01:12

Re: セレクタで文字がクリックできない / みつ
速攻なご対応ありがとうございます。
以下の?Aを両方試してみましたが、「COM_Error:名前が不明です。」で止まってしまいましたが、動作保証対象外ということで了承しました。


call UwscWebDriver.uws //UwscWebDriver-0.7.2
driver = WebDriver.ChromiumEdge() //バージョン 94.0.992.31 (公式ビルド) (64 ビット)
driver.Navigate("https://xxx")

//?@
driver.FindElement("body > font > center:nth-child(6) > font > font").Click() ←動く、これをクリックすると次の画面に遷移する

//?A
戻り値 = driver.SwitchFrame(0) ← COM_Error
PRINT "FRAME1 " + 戻り値

戻り値 = driver.SwitchFrame(1) ← COM_Error
PRINT "FRAME2 " + 戻り値




>frame内ページも個別にURLがあるのでそれをnavigate()を使って別タブで開き操作する、という回避手段が使える場合があります
>本来開かれるframeの名前で別タブを開けばほかのframeからの操作もそちらに反映されるような気がするんですよね
>例えばframe1でボタン押下→frame2にページ展開
>みたいな作りならframe2のフリをした別タブを作る、という発想です
>(frame2の名前は変更しておく必要があります)
>名前というのはnavigate()の第二引数に渡すもので、window.nameのことでもあります
>targetの仕組みを逆手に取ってこちらの都合の良いようにするという話…なんですが説明難しいですね



以下で上手く右側の frame に移動することができました。
しかし、移動後の画面も SetValue や ボタン押下ができない為、UWSC関数で対応したいと思います。

driver.Navigate("https://xxxA","menu")
driver.Navigate("https://xxxB","main")

また、GetSourceで、ほしい「フレームソース」ではなく、「ページのソース」が取得されてしまいますので、UwscWebDriver上でフレームソース を取得する方法はないでしょうか。
どうにもならない場合は、CHKIMG等で無理やり取得したいと思います。

よろしくお願い致します。

No.1375 2021/09/26(Sun) 23:05:52

Re: セレクタで文字がクリックできない / stuncloud
> 「COM_Error:名前が不明です。」で止まってしまいました
すいません書き忘れてました
0.7.3が出てるのでそれを使ってください

> フレームソース を取得する方法はないでしょうか。
フレームソースとは何のことを指しているのでしょうか?

モジュールの機能だけでは得られないデータについては
・ExecuteScript()を使ったJavaScriptによる取得
を検討してみてください

No.1376 2021/09/27(Mon) 00:48:27

Re: セレクタで文字がクリックできない / みつ
ご連絡が遅くなりすみません。


>0.7.3が出てるのでそれを使ってください

失礼しました。
0.7.3 のダウンロード先が分からなかったので、以下の内容を UwscWebDriver.uws にコピペしたところ
driver.SwitchFrame()は無事に動きましたが、その後の driver.FindElement(selector).Click() は動きませんでした。

https://github.com/stuncloud/UwscWebDriver/blob/31a28c0080d218384ba2e1821be87825efd7f8b4/UwscWebDriver.uws

?@
戻り値 = driver.SwitchFrame(0)
PRINT "FRAME1 " + 戻り値

?A
戻り値 = driver.SwitchFrame(1)
PRINT "FRAME2 " + 戻り値


そこでご教授頂きたいのですが、上記?@の動作で frame を合わせて、その後に driver.FindElement(selector).Click() で
?@の frame の要素をクリックするという認識でよろしかったでしょうか。

また、その場合の selector は、開発者ツールの selector コピーで取得したもの(下の?B)を指定すれば動くという認識でよろしかったでしょうか。
それとも frame の頭の部分(下の?C)を繋げての指定になるのでしょうか。

どちらも試しましたが動きませんでした。

?B
driver.FindElement("body > form > table:nth-child(4) > tbody > tr:nth-child(7) > td:nth-child(2)").Click()

?C
driver.FindElement("html > frameset > frame:nth-child(1) > html > body > form > table:nth-child(4) > tbody > tr:nth-child(7) > td:nth-child(2)").Click()



>フレームソースとは何のことを指しているのでしょうか?

フレームの html ソースのことです。


>・ExecuteScript()を使ったJavaScriptによる取得を検討してみてください

承知しました。こちらでのソース取得を試してみます。



お忙しいところすみませんが、よろしくお願い致します。

No.1377 2021/09/27(Mon) 21:08:54

Re: セレクタで文字がクリックできない / stuncloud
> 0.7.3 のダウンロード先が分からなかったので
失礼しました、タグのpushもリリースもし忘れていました…
こちらでダウンロードできます
https://github.com/stuncloud/UwscWebDriver/releases/tag/0.7.3

> 上記?@の動作で frame を合わせて、その後に driver.FindElement(selector).Click() で
?@の frame の要素をクリックするという認識でよろしかったでしょうか。
よろしいはず…なんですが、こちらでも1つ目のフレーム(SwitchFrame(0))の操作ができなかったのでなにかやり方が間違っている、または不足しているのかもしれません
如何せん細かい情報がないのでよくわからないのです
SwitchFrame(0)自体は成功するんですけどね…

> また、その場合の selector は、開発者ツールの selector コピーで取得したもの(下の?B)を指定すれば動くという認識でよろしかったでしょうか。
> それとも frame の頭の部分(下の?C)を繋げての指定になるのでしょうか。

?Bの書き方で良いはず…です
こちらで操作できたフレームはそのようにしていました

フレーム内の操作についてもJavaScriptでできるかもしれないです
各フレームへのアクセスについては以下を参照してください
(この場合SwitchFrame()はしないほうが良いです)

https://developer.mozilla.org/ja/docs/Web/API/Window/frames

No.1378 2021/09/27(Mon) 23:06:48

Re: セレクタで文字がクリックできない / みつ
>こちらでダウンロードできます

ご対応頂きありがとうございました


>フレーム内の操作についてもJavaScriptでできるかもしれないです
>各フレームへのアクセスについては以下を参照してください
>(この場合SwitchFrame()はしないほうが良いです)


承知しました。
JavaScript を勉強して試してみます。

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

No.1379 2021/09/28(Tue) 10:39:00
IEからEDGEではまっています。 / ながいも
IEからEdgeへの置き換えでお教えください。
これまで通常に動いていた治具パソコンが急遽下記のエラーが発生するようになりました。
until ( ! ie.busy ) and ( ie.readystate = 4
恐らくはIEからEDGEに標準ブラウザを置き換えられたためかと思います。

そこで応急処置を施したいのですが
コンパネで標準ブラウザをIEに設定しなおしてもクロスケーブルで接続している基板を見に行こうとした際にEDGEに接続され上記COMエラーが発生してしまいます。

IE="(C:*****:edge)"と定義しても多分ダメですよね?
短時間で切り替えられる方法があればお教えください。
何卒よろしくお願いいたします

No.1365 2021/09/21(Tue) 12:40:00

Re: IEからEDGEではまっています。 / stuncloud
> IE="(C:*****:edge)"と定義しても多分ダメですよね?
ダメです

> 短時間で切り替えられる方法があればお教えください。
今までの資産を活かしつつ、比較的短時間で移行 **できるかもしれない** 方法は一応あります

ステップ1: 捜査対象サイトをEdgeのIEモードで開きます

EdgeのIEモードで開いているサイトであれば外部からCOMオブジェクトとして掴むことができます
IEモードによるサイトの開き方は別途お調べください
# ローカル環境であれば設定からurlを指定できます
# Active Directory配下のPCであればグループポリシーによる操作が必要になる?みたいです

ステップ2: IEモードで開かれたページをCOMオブジェクトとして取得する

https://junjun777.hatenablog.com/entry/20120212/uwsc_hwnd_ie_object

こちらを参照ください
以下のような使い方になります

call ie_getObject.uws

dim wid = GETID("- Microsoft​ Edge", "Chrome_WidgetWin_1")
dim ie = IeObject.Get(wid)
if ie = 0 then
 msgbox("IEモードの取得失敗")
endif

msgbox(ie.document.url) // urlを表示

# このieオブジェクトはInternetExplorer.Applicationのそれとは若干異なります


大幅な改修が必要になりますがUwscWebDriverを使うという方法もあります
https://github.com/stuncloud/UwscWebDriver

No.1366 2021/09/21(Tue) 15:25:53

Re: IEからEDGEではまっています。 / しろまさ
> コンパネで標準ブラウザをIEに設定しなおしてもクロスケーブルで接続している基板を見に行こうとした際にEDGEに接続され上記COMエラーが発生してしまいます。

とりあえず↑これの対策
https://samurai-computer.com/how-to-stop-force-stwitching-internet-explorer-to-microsoft-edge/

No.1367 2021/09/22(Wed) 14:05:18

Re: IEからEDGEではまっています。 / ながいも
stuncloudさんしろまささん
ご回答いただきありがとうございました。
ワクチンの副反応で苦しんで中催促ばかりされるため取り急ぎの対策として
pcを復元ポイントで使えていたころまで戻し、オフラインで利用をさせ
年内にedge対応プログラムを作成しようかと思います。
ieとedgeは別物と考えUWscwebDriverを利用した新規設計にしようとおもいます。

No.1368 2021/09/23(Thu) 16:49:21
name属性が被ってしまった場合のvalueでの指定の仕方を教えて頂きたいです。 / kenken
管理人様お忙しい所失礼致します。

IEでUWSCを使用しておりましたがIEが使えなくなるのでEdgeに変更して作業を行いたいと思っております。

こちらの掲示板をご用意して頂けている事に感謝申し上げます。

お忙しい所大変恐縮ですが質問をさせてください。

-----------
●質問
-----------
call UwscWebDriver.uws

driver = WebDriver.Edge()

でEdgeを起動させた際に

<label><input type="radio" name="sex_cd" value="none" checked="checked"> 指定しない</label>
<label><input type="radio" name="sex_cd" value="0"> 男性</label>
<label><input type="radio" name="sex_cd" value="1"> 女性</label>

上記のようにname属性が被ってしまうためvalueで男性等を指定したいのですが、どうすればいいのでしょうか?


-----------
●目的
-----------
男性のラジオボタンにチェックを入れたい

submit = driver.FindElement("input[name=<#dbl>sex_cd")//
submit.Click()
Sleep(2)

これだと性別を指定しないになる為にvalueで性別を指定したいです

-----------
●試したコード
-----------
?@
submit = driver.FindElement("input[name=<#dbl>sex_cd,"0"]")// 男性
submit.Click()
Sleep(2)

?A
submit = driver.FindElement("sex_cd","value='0')// 男性
submit.Click()
Sleep(2)

お忙しい所大変恐縮ですがご教授頂けると幸いです。

No.1362 2021/09/14(Tue) 23:30:28

Re: name属性が被ってしまった場合のvalueでの指定の仕方を教えて頂きたいです。 / stuncloud
だいたい以下のようなやり方でできるはずです
# コードは動作確認してないので間違いがあったらごめんなさい
# でも考え方のヒントにはなると思います

案1: for-inしてvalueが一致したらクリック

selector = "input[name=<#dbl>sex_cd<#dbl>]"
for elem in driver.FindElements(selector) // FindElementsだと該当するものを配列で返す
 if elem.GetAttribute("value") = 0 then
  elem.Click()
  break
 endif
next

案2: セレクタでvalueも指定

// valueもattributeなので多分これでもできる
textblock male
input[name="sex_cd"][value="0"]
endtextblock

driver.FindElement(male).Click()

No.1363 2021/09/15(Wed) 00:47:04

Re: name属性が被ってしまった場合のvalueでの指定の仕方を教えて頂きたいです。 / kenken
早速の回答ありがとうございます。

教えて頂いた二つのコードはどちらも動きました!

これで一気に作業が進みます。

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

No.1364 2021/09/15(Wed) 07:51:36
IEで実現していたパスワード入力の自動化は、Edge+WebDriverで対応できるのでしょうか? / maco
UWSC 仮 掲示板 管理人様・ご利用される皆様

初の投稿をさせていただきます。macoです。
質問させてください。


社内の標準ブラウザがEdgeに代わります。

その際、WebDriverを利用すればパスワード入力の自動化が継続利用できるのか知りたいと思います。
WebDriverを利用し、以下のソースを最大活用した対応はできるのでしょうか?

たとえば、以下のuwsソースにて、

// 起動したIEを取得
IE = GETACTIVEOLEOBJ("InternetExplorer.Application", "ログイン認証ページ")

上記のIE代入処理を、WebDriverのオブジェクトに置換するよいのでしょうか?
それとも、WebDriverの場合は全く別の方法に変更が必要なのでしょうか?

社内Webごとにパスワード入力画面があり、それ用のuwsファイルを複数用意しています。
それらのEdge対応は、小修正ですむのか、作り直し規模が要るのか把握したく、お知恵を拝借させてください。

小修整の場合は、事例をいただけるとそれを他のuwsにも反映させたいと思います。
お忙しいと思いますが、よろしくお願いいたします。



IEで利用しているuwsソース
――――――――――――――――――――――――
CALL common.uws // CALL "common.uws" でも良い

// 起動したIEを取得
IE = GETACTIVEOLEOBJ("InternetExplorer.Application", "ログイン認証ページ")

// IEの表示を待つ
While IE.Busy OR IE.readyState <> 4
SLEEP(0.1)
WEnd

// ユーザ名・パスワードを入力し反映
IE.document.frames("main").document.forms[0].username.value = cUserName
IE.document.frames("main").document.forms[0].password.value = cPassword
IE.document.frames("main").document.forms[0].submit()
――――――――――――――――――――――――
Edgeバージョン
バージョン 92.0.902.73 (公式ビルド) (64 ビット)

――――――――――――――――――――――――
用意したWebDriver
https://msedgewebdriverstorage.z22.web.core.windows.net/?prefix=92.0.902.73/

No.1355 2021/09/05(Sun) 20:54:52

Re: IEで実現していたパスワード入力の自動化は、Edge+WebDriverで対応できるのでしょうか? / stuncloud
WebDriverについて知りたいとのことですが、UWSCからの利用を想定してUwscWebDriver利用時の状況を説明します

これです
https://github.com/stuncloud/UwscWebDriver

基本的に同じ操作は出来ますが、IE用コードの使い回しは出来ません
すべて書き直しが必要になります

そして気になった点
> IE.document.frames("main").document.forms[0].username.value = cUserName
を見るにframeを使ったページのようですね
上で基本的に、と書きましたが例外もあり、frame操作は例外になります
需要がなかろうということでframe対応をしていなかったためです
(これはまあ、僕が機能を実装すれば出来るようになるんですが…)
とは言えframe内のページを(URL直指定で)個別に開けばいくらでも操作可能ではあります

あとGETACTIVEOLEOBJ相当のものがないです
つまりすでに起動しているブラウザを操作するすべがありません
(UwscWebDriverから起動したブラウザであれば後から再接続して操作することは可能なのですが)

というわけで
今のところUwscWebDriverで代替するのはmacoさんにとっては厳しい選択になるやもしれません
学習や実装に十分な時間が得られないのであれば難しいかと想います

とは言えこの結論だとあんまりなので、UwscWebDriver以外の手段も考えてみましょう
先ずは、今までの資産(IE用コード)の活用できる可能性がもしかしたらあるかも、という話をします

MS Edgeの『IEモード』を使って社内Webページを開くというのであれば、そのオブジェクトを外部から掴めるかもしれません
以前しゅんさんが書かれたこれ
https://junjun777.hatenablog.com/entry/20120212/uwsc_hwnd_ie_object
ですね
(まあこれもIHTMLDocument2なのでいわゆるIEオブジェクトと呼んでるやつとは異なるので多少コードが変わる可能性あり)
(あと実際試したことがないのでこの方法は使えないかもということは留意しといてください)

さて、最後に身もふたもない手段の話です!

MS Edgeであればログイン情報の保存と自動入力が可能なので
> パスワード入力の自動化
「だけ」が目的であればそれを使うのも手です
(むしろその方が楽だと思うのでこれが本命)

No.1356 2021/09/05(Sun) 23:38:40

Re: IEで実現していたパスワード入力の自動化は、Edge+WebDriverで対応できるのでしょうか? / maco
stuncloud様
返信、ありがとうございます。

>> パスワード入力の自動化
> 「だけ」が目的であればそれを使うのも手です(むしろその方が楽だと思うのでこれが本命)


実は、社内用のEdgeはパスワード保存が無効化されているのです。
万一を想定し、石橋を叩いて渡る対策、とのことでした……。



> 基本的に同じ操作は出来ますが、IE用コードの使い回しは出来ません
> すべて書き直しが必要になります
>
> そして気になった点
>> IE.document.frames("main").document.forms[0].username.value = cUserName
> を見るにframeを使ったページのようですね
> 上で基本的に、と書きましたが例外もあり、frame操作は例外になります



22年9月まではIEが使えると思います。
また、イントラ専用としてならIE起動はできるのかな、と淡い希望を抱いています。

上記を見て、勉強していきたいと思います。ありがとうございました。

No.1358 2021/09/07(Tue) 16:43:01

Re: IEで実現していたパスワード入力の自動化は、Edge+WebDriverで対応できるのでしょうか? / maco
stuncloud様・皆さま

以下のように対応しました。参考になれば。

Edgeの場合(指定ウィンドウの起動を検出したものの、IEオブジェクトを取得できない=Edgeが起動した)は、vbsを起動しパスワード設定(common.uws)を読み込み、SendKeysでユーザ名・パスワードを打ち込む。としました。

SendKeys利用のため、Edgeウィンドウにフォーカスが当たっていなければ失敗する可能性もあります。

ただ、もともとUWSCのスケジュール設定で、指定文字列のウィンドウが起動したときに、uwsファイルを実行するようにしていましたので、ほぼ問題になることはありません。


参考ソース
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
CALL common.uws  // CALL "common.uws" でも良い

Try
  // 起動したIEを取得
  IE = GETACTIVEOLEOBJ("InternetExplorer.Application", "Web Single Sign On")

  // IEの表示を待つ
  While IE.Busy OR IE.readyState <> 4
    SLEEP(0.1)
  WEnd

  IE.document.frames("main").document.forms[0].username.value = cUserName
  IE.document.frames("main").document.forms[0].password.value = cPassword
  IE.document.frames("main").document.forms[0].submit()
Except
  Exec("wscript SendKeys.vbs")
EndTry


SendKeys.vbsのイメージ
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Dim objWS: Set objWS = CreateObject("WScript.Shell")

id = ユーザ名 読み込み処理
pw = パスワード 読み込み処理

objWS.SendKeys(id)
objWS.SendKeys("{TAB}")
objWS.SendKeys(pw)
objWS.SendKeys("{ENTER}")

No.1359 2021/09/13(Mon) 18:32:24

Re: IEで実現していたパスワード入力の自動化は、Edge+WebDriverで対応できるのでしょうか? / stuncloud
vbsの部分もUWSCで出来ますよ
(SendKeysもできるし、組み込みのkbd()でも良い)

No.1360 2021/09/13(Mon) 20:59:18

Re: IEで実現していたパスワード入力の自動化は、Edge+WebDriverで対応できるのでしょうか? / maco
> vbsの部分もUWSCで出来ますよ
> (SendKeysもできるし、組み込みのkbd()でも良い)


stunclound様、ありがとうございます。
以下のように変更することで、vbsが不要になりました。

Repeat〜Untilは、SendKeysでの入力失敗を想定しています。

−−−−−−−−−−−−−−−−−−−−−−−−−−
CALL common.uws // CALL "common.uws" でも良い


Const cTitle = "Web Single Sign On"

Try
 // 起動したIEを取得
 IE = GETACTIVEOLEOBJ("InternetExplorer.Application", cTitle)

 // IEの表示を待つ
 While IE.Busy OR IE.readyState <> 4
  SLEEP(0.1)
 WEnd

 IE.document.frames("main").document.forms[0].username.value = cUserName
 IE.document.frames("main").document.forms[0].password.value = cPassword
 IE.document.frames("main").document.forms[0].submit()
Except
 Dim objWS = CREATEOLEOBJ("Wscript.Shell")
 Repeat
  Sleep(cSleepSec)
  objWS.SendKeys("{DELETE}")
  objWS.SendKeys(cUserName)
  objWS.SendKeys("{TAB}")
  objWS.SendKeys(cPassword)
  objWS.SendKeys("{ENTER}")
 Until GETID(cTitle) = -1
EndTry

No.1361 2021/09/14(Tue) 12:11:43

以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
200/200件 [ ページ : << 1 ... 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 20 >> ]

- HOME - お知らせ(3/8) - 記事検索 - 携帯用URL - フィード - ヘルプ - メール - 環境設定 -

- Skin: Modern v2.0 - Author: ロケットBBS -

Rocket Board Type-X (Free) Rocket BBS