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

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

XLOPEN について / みつ
お世話になっております。

年明けから XLOPEN を使用しようとすると、「EXCEL cannot be started」 と出て
全ての EXCEL を開けなくなったのですが、microsoft に対策された感じなのでしょうか?
XLOPEN 以外の COM は使えます。

よろしくお願いします。

No.1429 2022/01/07(Fri) 17:23:35

Re: XLOPEN について / stuncloud
createoleobj("Excel.Application")
とした場合はどうでしょうか? (内部的にはこれを叩いてるとおもうので結果は同じ可能性が高いですが)
年明けからとなるとExchangeの日付バグが思い浮かびますが同じ原因だったらいやですね…

No.1430 2022/01/07(Fri) 17:56:08

Re: XLOPEN について / stuncloud
あとは
・スタートメニューなどからExcelは起動するのか?
・UWSC以外からCOMで起動できるのか?
 例:PowerShell
 (New-Object -ComObject Excel.Application).Visible=$true

あたりも確認してみてください

それと気になった点をひとつ
> microsoft に対策された感じ
正式な機能なのでMSが使えなくするならそれは「対策」ではありませんし、機能停止が正式にアナウンスされるはずです

No.1431 2022/01/07(Fri) 18:19:43

Re: XLOPEN について / みつ
>createoleobj("Excel.Application")
>とした場合はどうでしょうか?


以下のエラーが出てしまいます。
COM_Error:クラス文字列が無効です,ProgID:"Excel.Application"
6行目:EXCEL = CREATEOLEOBJ("Excel.Application")


>(New-Object -ComObject Excel.Application).Visible=$true

「80040154 クラスが登録されていません」と出てしまい起動できません。


>・スタートメニューなどからExcelは起動するのか?

手動で起動はできます。


2台 WIN10 の PC があり、その内の一台でのみ現象が発生しています。

また、現象が発生している PC で以下は問題なく動きます。
IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = True

エクセルの設定とかあるのでしょうか?
よろしくお願いします。

No.1432 2022/01/08(Sat) 07:22:12

Re: XLOPEN について / stuncloud
ProgIDが登録されてないのだとすれば以下のような方法で改善するかもしれません

・Excelを修復インストールする (インストーラのメニューからアンインストールではなく修復を選択)
・Excelをアンインストール後再インストールする
・Excelが64ビット版だった場合は32ビット版をインストールする

また、複数のバージョンのExcelがインストールされている場合はProgIDでバージョン指定する必要があるかもしれません
例: Excel.Application.16

No.1433 2022/01/08(Sat) 10:32:13

Re: XLOPEN について / みつ
>・Excelを修復インストールする (インストーラのメニューからアンインストールではなく修復を選択)
>・Excelをアンインストール後再インストールする


週明けに確認してみます。


>・Excelが64ビット版だった場合は32ビット版をインストールする

Excel は32ビットです。


>複数のバージョンのExcelがインストールされている場合はProgIDでバージョン指定する必要があるかもしれません

reg query HKEY_LOCAL_MACHINE\Software\Classes\ | findstr \.Application | more で確認したところ、Excel.Application しか入っていませんでした。

エクセルのバグと考えられ為、修復インストールしてしてみます。

No.1434 2022/01/08(Sat) 14:03:47

Re: XLOPEN について / みつ
stuncloud 様

本日、Excel を修復インストールしたところ無事に直りました。
エクセルが壊れることもあるんですね。
的確なご回答ありがとうございました。
助かりました。

また、よろしくお願いします。

No.1438 2022/01/11(Tue) 19:40:26
OleEvent関数の引数について / John
お世話になっております。

createform関数で作成したフォームが閉じられた際に、プログラム全体を終了するイベント処理をセットしたいのですが、可能でしょうか?
(Threadは使用せず、OleEventによるイベント処理でプログラム終了を実装したい所存です。)

可能でしたら、OleEventに与える引数をご教授願いします。


IEオブジェクト終了時のイベント処理のように、下記記述を試しましたが、うまくいきませんでした。

f=CREATEFORM("about:blank","createform sample",true)
OleEvent(f, "DWebBrowserEvents2", "OnQuit", "Quit" )
--------------------------------------------------------

Procedure Quit()
 exitexit
Fend


宜しくお願いいたします。

No.1435 2022/01/09(Sun) 15:41:26

Re: OleEvent関数の引数について / stuncloud
OnQuitはIE専用?のようでUWSCのフォームでは使えないようです
createformを非同期実行した場合によく使われるのが

while f.visible
 sleep(0.1)
wend

といった待機処理ですが、これはvisibleプロパティがfalseならフォームが閉じられたとみなしているわけです
なのでvisibleが変わったかどうかを検出できるOnVisibleイベントを使います
https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa768294(v=vs.85)

OleEvent(f, "DWebBrowserEvents2", "OnVisible", "Quit" )

Procedure Quit()
 // visibleの値を確認しfalseならフォームが閉じられたとみなして終了
 if EVENT_PRM[0] = false then
  quitquit
 endif
Fend

# 注意点

自分でf.visibleにfalseを代入してもイベントが発火してしまいます
場合によっては実際に閉じられたかどうか?の確認も必要になります

# 蛇足

WindowClosingというイベントもありますがこれはwindow.close()が叩かれたときに発火するイベントのようで
今回のケースでは使えませんでした

No.1436 2022/01/09(Sun) 17:44:35

Re: OleEvent関数の引数について / John
ご回答いただき誠にありがとうございます。

おかげさまで目的の動作を実現することができました。

心から感謝申し上げます。

No.1437 2022/01/09(Sun) 20:08:59
uwscの動くタブレット / sen
いつもお世話になっております。
uwscの動くwindowsタブレットでお薦めはありませんか?
宜しければ、お教え下さい。

No.1426 2021/12/29(Wed) 13:44:04

Re: uwscの動くタブレット / stuncloud
ARM版WindowsでなければUWSCは動くので、あとは好みや予算によるかと思います
好みで言えば僕ならSurfaceですね、一応タブレットの範疇…のはず…

No.1427 2021/12/30(Thu) 15:53:31

Re: uwscの動くタブレット / sen
やっぱりそうですよね。
今日、Surfaceを見てきました。
ご返答、ありがとうございました。

No.1428 2021/12/31(Fri) 00:02:17
当掲示板におけるUwscWebDriver対応終了のお知らせ / stuncloud
以後はdiscordおよびgithubを正式なサポート窓口とします

・discord

UWSCRサーバー内のチャンネルです
リリース告知をしています
質問・要望・バグ報告の受付もします

https://discord.gg/s49BxCx58h

・github

主に掲示板のように使えるDiscussionsを利用します
明らかなバグがあった場合はIssuesからご報告ください
Issuesを作成していいのかわからない場合はまずDiscussionsに書き込んでください

https://github.com/stuncloud/UwscWebDriver/discussions
https://github.com/stuncloud/UwscWebDriver/issues

新規にDiscussionを始める方法

1. https://github.com/stuncloud/UwscWebDriver/discussions を開く
2. [New discussion] ボタンを押し <Start a new discussion> 画面を開く
3. [Select category] ボタンを押し適切なカテゴリを選択する
4. タイトル欄に概要、本文に詳細を記入
5. [Start discussion] ボタンを押す


※ この告知は当掲示板におけるUwscWebDriverの話題を禁止するものではありません
  しかし、こちらへの書き込みを行っても僕(作者)が対応することはなくなります
  (Discussionsへの誘導を行うことはありえます)

No.1425 2021/12/07(Tue) 11:14:33
SetValueメソッドとGetValueメソッドの動作について / ukonniemi
SetValueメソッドでテキストボックスに値を入力する時、例えば既に"foo"と
入力されている状態で、SetValue("bar")を実行すると、入力内容が"foobar"になって
しまいます。

ページ表示後にテキストボックスに入力された内容をGetValueメソッドで取得しよう
としても、空文字列が返されます。UwscWebDriverのソースを見ると、input要素の
value属性の値を返すだけで、初期値しか取得できない仕様になっています。

SetValue("bar")を実行したら、テキストボックスの現在値に関係なく"bar"になり、
GetValue()を実行したら、初期値ではなく現在値を取得できるように出来ないでしょうか。

No.1418 2021/12/05(Sun) 02:13:45

Re: SetValueメソッドとGetValueメソッドの動作について / stuncloud
> SetValueメソッドでテキストボックスに値を入力する時、例えば既に"foo"と
> 入力されている状態で、SetValue("bar")を実行すると、入力内容が"foobar"になって
> しまいます。

SetValue()の前にClear()を呼んでください

> SetValue("bar")を実行したら、テキストボックスの現在値に関係なく"bar"になり、
> GetValue()を実行したら、初期値ではなく現在値を取得できるように出来ないでしょうか。

input要素のvalueと見た目の値が異なるのであればそこに表示されているのはおそらくinputに被せてある別の要素(エレメント)です
開発者ツールで確認してみてください

その手のものはおおよそ
1. 被せてある要素にユーザが入力する
2. 入力された値を本来のinputのvalueに反映する
といったことをやってるはずで、直接inputのvalueが変更されることはほとんどの場合想定されておらず表示との不整合が生じます
とはいえsubmitして送られる値はinputのvalueなので特に問題ないケースが大半だと思われます

No.1419 2021/12/05(Sun) 04:22:32

Re: SetValueメソッドとGetValueメソッドの動作について / ukonniemi
> SetValue()の前にClear()を呼んでください

Clear()の呼び出しで解決しました。GitHubのWikiにはClearメソッドの記載がありません。

> input要素のvalueと見た目の値が異なるのであればそこに表示されているのはおそらくinputに被せてある別の要素(エレメント)です
> 開発者ツールで確認してみてください
>
> その手のものはおおよそ
> 1. 被せてある要素にユーザが入力する
> 2. 入力された値を本来のinputのvalueに反映する
> といったことをやってるはずで、直接inputのvalueが変更されることはほとんどの場合想定されておらず表示との不整合が生じます
> とはいえsubmitして送られる値はinputのvalueなので特に問題ないケースが大半だと思われます


開発者ツールでコードを見ましたが、別の要素を被せるような手法は使われていませんでした。
現状のUwscWebDriverの仕様では、GetValue()ではvalue属性の値しか取得できないので、
以下のような代替手段を試したら、期待通りの動作をしました。このやり方なら、フォームに手入力
された内容も取得できます。

foo = driver.ExecuteScript("return document.getElementById('hoge').value;")

No.1420 2021/12/06(Mon) 03:33:26

Re: SetValueメソッドとGetValueメソッドの動作について / stuncloud
> Clear()の呼び出しで解決しました。GitHubのWikiにはClearメソッドの記載がありません。
確認しました
wikiを更新します

> 現状のUwscWebDriverの仕様では、GetValue()ではvalue属性の値しか取得できないので、
inputに表示されている値とvalue属性値は同じもののはずなのでなぜそのようなことになってるのかは正直わかりません
これはWebDriverがそのように動作しているのが原因なので、UwscWebDriverとしては仕様となります (修正対応は行いません)

No.1421 2021/12/06(Mon) 09:54:37

Re: SetValueメソッドとGetValueメソッドの動作について / ukonniemi
> inputに表示されている値とvalue属性値は同じもののはずなのでなぜそのようなことになってるのかは正直わかりません
> これはWebDriverがそのように動作しているのが原因なので、UwscWebDriverとしては仕様となります (修正対応は行いません)


<input type="text" name="foo" value="bar"> この場合の"bar"は初期値なので、
テキストボックスの入力内容を変更すると、表示上の値とvalue属性の値は一致しなくなります。
例えば、"baz"と入力しても、value="baz"に変化するわけではありません。
GetValue()がvalue属性の値を返している以上、入力値が変更された後の表示上の値と取得した値が
違うのは当然の結果です。

call UwscWebDriver
WebDriver.HideCmd()
opt = WebDriver.Option("edge")
wd = WebDriver.Edge(9515, opt)
ifb wd = NULL then
print "ブラウザを起動できません。"
exitexit
endif
wd.Navigate("https://www.google.co.jp/")
inp = wd.FindElementsByName("q")[0]
inp.SetValue("foo")
print "<#DBL>" + inp.GetValue() + "<#DBL>"
print "<#DBL>" + wd.ExecuteScript("return arguments[0].value", JS.Args(inp.raw())) + "<#DBL>"

上記のサンプルコードの実行結果は以下の通りです。

""
"foo"

SetValue()で入力した値がGetValue()で取得できないのは、set/getがwrite/readの対の関係になって
いない訳で、違和感のある仕様と言わざるを得ません。

No.1422 2021/12/07(Tue) 02:34:05

Re: SetValueメソッドとGetValueメソッドの動作について / stuncloud
状況を把握しました
WebElement.prototype.GetProperty()
を新設します

No.1423 2021/12/07(Tue) 09:49:09

Re: SetValueメソッドとGetValueメソッドの動作について / stuncloud
0.8.1をリリースしました
https://github.com/stuncloud/UwscWebDriver/releases/tag/0.8.1

No.1424 2021/12/07(Tue) 10:00:51
「自動テストソフトウェアによって制御されています」のメッセージ消すことができますか / nyoshikawa
IEベースの自動化をMSEdg版に移行中のところUwscWebDriverで大変お世話になっております。

当初から気になっていたのですが...
UwscWebDriverでMSEdgeを起動すると毎回「自動テストソフトウェアによって制御されています」のメッセージが表示されてます。

表示を閉じようと、右端の「X」閉じるボタンはあるようですが、手動でもクリックが出来ません。

できればUWSCでこの表示を消したいとも思うのですが、抑止方法がわかりません
何か情報、または方法がありましたらご教授下頂けないでしょうか?

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

No.1412 2021/11/22(Mon) 01:50:12

Re: 「自動テストソフトウェアによって制御されています」のメッセージ消すことができますか / stuncloud
以下の方法で消せるようです
https://qiita.com/fugafug92573304/items/6f5b68b4a1a7971a05f8

EdgeCapabilitiesTemplateという雛形があるので、それに上記を加えたtextblockを新たに作りWebDriver.Edge()の第2引数に渡してください

No.1413 2021/11/22(Mon) 05:44:43

Re: 「自動テストソフトウェアによって制御されています」のメッセージ消すことができますか / stuncloud
参考
https://docs.microsoft.com/ja-jp/microsoft-edge/webdriver-chromium/capabilities-edge-options#edgeoptions-object

こちらでも試してみたところ一応「自動テストソフトウェアによって制御されています」のinfobarは消えました
ただ、それを行ったために別の何かが生じるということはあり得ます
ではそれに対してどのような対応が必要なのか?となるとさすがにサポートの範囲外になるのであとは自己責任でお願いします

No.1414 2021/11/22(Mon) 07:21:44

Re: 「自動テストソフトウェアによって制御されています」のメッセージ消すことができますか / nyoshikawa
いろいろ教えていただき、ありがとうございます。

> こちらでも試してみたところ一応「自動テストソフトウェアによって制御されています」のinfobarは消えました

あれから色々試してみましたが...

//以下試したコード ----------------------------------------------
msgbox(WebDriver.Version()) // 0.8.0
WebDriver.HideCmd()
driver = WebDriver.ChromiumEdge(9515, szEdgeCapabilitiesTemplate2)
driver.Navigate("https://www.google.com/")
exit

//"excludeSwitches", ['enable-automation', 'load-extension']
textblock szEdgeCapabilitiesTemplate2
{
"capabilities": {
"alwaysMatch": {
"browserName": "msedge",
"ms:edgeOptions": {
"args": [ ]
"excludeSwitches": ["enable-automation", "load-extension"]
}
}
}
}
}
endtextblock
//以上 試したコード ----------------------------------------------

実行すると
COM_Error:例外が発生しました。
C:\......\WEBDRIVER\UWSCWEBDRIVER.UWS: 141行目: RESULT = CODEOBJECT.WebDriver.Start(URI, CAPABILITIES, DEBUG)
とエラーとなってしまいました。

ms:edgeOptionsの配下の「args」と同レベルの項目と思い、あのようなりました。

「"excludeSwitches": ["enable-automation", "load-extension"]」の行を除外すると
とりあえず動作しますが、実際はどう記述するのが正しいのでしょうか?

(このテキストプロック(szEdgeCapabilitiesTemplate2)の記述方法が良くわかっていません。)


> ただ、それを行ったために別の何かが生じるということはあり得ます
> ではそれに対してどのような対応が必要なのか?となるとさすがにサポートの範囲外になるのであとは自己責任でお願いします


弊害がある場合は、デフォルトに戻したいと思います。

No.1415 2021/11/22(Mon) 22:52:16

Re: 「自動テストソフトウェアによって制御されています」のメッセージ消すことができますか / stuncloud
> ms:edgeOptionsの配下の「args」と同レベルの項目と思い、あのようなりました。
書く場所はそこで良いです
間に , がないのがダメです (jsonが不正)

No.1416 2021/11/23(Tue) 00:33:54

Re: 「自動テストソフトウェアによって制御されています」のメッセージ消すことができますか / nyoshikawa
> > ms:edgeOptionsの配下の「args」と同レベルの項目と思い、あのようなりました。
> 書く場所はそこで良いです
> 間に , がないのがダメです (jsonが不正)


おしえていただいた下記記述で解決しました。
たいへんありがとうございます。<(_ _)>

しばらくこれで様子を見たいと思います。
//--------------------------------------------
textblock szEdgeCapabilitiesTemplate2
{
"capabilities": {
"alwaysMatch": {
"browserName": "msedge",
"ms:edgeOptions": {
"args": [ ] ,
"excludeSwitches": ["enable-automation", "load-extension"]
}
}
}
}
endtextblock
//--------------------------------------------

No.1417 2021/11/23(Tue) 19:08:15
nameにランダム文字列が結合されているdivタグをクリックしたい / yu
以下のdivタグをクリックしたいのですが、nameはランダム文字列が結合されているため
UwscWebDriverのExecuteScriptでjsを実行しようとしたのですが、反応しませんでした。
開発者ツールでスクリプトが正常に実行できることと、ExecuteScriptでjavascriptのalertを実行できることは確認できてます。(UWSCWEBDRIVERが正常に動作することの確認)

やり方が間違っている、または別のアプローチが良いなどご教授いただけないでしょうか。


■環境
Chrome バージョン: 96.0.4664.45
UWSC Free版 Ver5.3.0.2
UWSCWEBDRIVER MODULE_VERSION = "0.8.0"


■クリックしたいdivタグ
<div class="*ランダム文字列* last-name"></div>


■実行したコード

CALL UwscWebDriver.uws
DIM driver = WebDriver.Chrome()

textblock js
document.querySelectorAll(`.last-name`)[0].click()
endtextblock

driver.ExecuteScript(js)

No.1407 2021/11/20(Sat) 14:08:29

Re: nameにランダム文字列が結合されているdivタグをクリックしたい / stuncloud
なんでしょうね
> document.querySelectorAll(`.last-name`)[0].click()
` ではなく ' か " にしたほうが良いのかも?
jscriptを経由するのでそれによる不都合とかあるかもしれないんですが
文字列中の ` なのでjscriptでどうということもないと思うんですけどね

それはそれとしてクリックするだけなら
driver.FindElement("div.last-name").Click()
でできませんか?
.last-name が一意なのであればこれでいいと思います

driver.FindElements("div.last-name")[0].Click()
も同じことです

No.1408 2021/11/20(Sat) 14:38:46

Re: nameにランダム文字列が結合されているdivタグをクリックしたい / yu
stuncloudさん、早急なご返信ありがとうございます

> .last-name が一意なのであればこれでいいと思います
last-nameが一意になります。

` や 'を試してみましたがダメでした。
また。以下を試して見ましたが、elementsの要素が0だったので正常に取れてないようです。FindElementsの書き方を変えてもう少し調べてみます。

DIM elements = driver.FindElements("div.last-name")
PRINT (length(elements))
FOR element IN elements
element.Click()
PRINT ("クリック")
BREAK
NEXT

あと、私もdriver.FindElements("div.last-name")[0].Click() の書き方で合ってると思ったのですが、これは型が合っていないと怒られてしまいました。

No.1409 2021/11/20(Sat) 15:26:19

Re: nameにランダム文字列が結合されているdivタグをクリックしたい / stuncloud
> また。以下を試して見ましたが、elementsの要素が0だったので正常に取れてないようです。FindElementsの書き方を変えてもう少し調べてみます。
開発者ツールで動作しているということはセレクタは合ってるのでしょうが、それでなお見つからないとすると以下が考えられます

・操作時点で該当divが描画されていない
・frame内のページなのでアクセスできない

前者であれば

while true
 div = driver.FindElement("div.last-name")
 if div <> null then
  break
 else
  sleep(1)
 endif
wend
div.click()

のようにすれば描画され次第クリックを行います
後者であるとやや面倒で、以下のような感じになります

1. 対象divがあるページのURLを何かしらの手段で得る
2. そのURLを別ダブで直接開く
3. タブを切り替えて操作
4. 操作後不要であればタブを閉じて元のタブに戻る

暫定的なframe対応(SwitchFrame()メソッド)は一応あるんですが動作があやしいので非推奨です

> あと、私もdriver.FindElements("div.last-name")[0].Click() の書き方で合ってると思ったのですが、これは型が合っていないと怒られてしまいました。
すいません、SAFEARRAYを返すので大丈夫なものだと思いこんでいました
JSメソッドには直接[]が書けないのかもしれません

elems = driver.FindElements(selector)
elems[0].click()

なら大丈夫なはずです

No.1410 2021/11/20(Sat) 17:34:07

Re: nameにランダム文字列が結合されているdivタグをクリックしたい / yu
返信遅れてすみません。
色々とご検討くださりありがとうございます。

> ・操作時点で該当divが描画されていない
> ・frame内のページなのでアクセスできない

クリックしたい画面を開いたままUWSCを起動しており、frameは使用されてないことから
上記でもないんですよね。いろいろと試してみましたが、成功せず原因が謎です。

本来行おうとしていたのは、特定画像(GIF)を探してクリックしたかったのですが、CHKIMG関数だとうまく認識してくれず、
また、CHKIMGX関数でもできませんでした。CHKIMGX関数を使用したときは(各PC環境を考慮するのがめんどくさかったので)
座標指定など引数を細かく指定していなかったせいかもしれません。
そのため、スクリプトを直接実行できないかということで質問の壁に当たってしまいました。

画像認識自体ひとつも成功したことがないので、まず画像認識できるところから見直したいと思います。

No.1411 2021/11/21(Sun) 21:09:14
(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

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

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

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

Rocket Board Type-X (Free) Rocket BBS