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

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

global.関数名に使い方について / nanai
global.関数名に使い方がいまいち分かりません。

[RegularExpress.uws]にある、RowsPassOpenMatchValue関数内の「utuwa1 = STRINGCONTROL.DuplicateDelete_Str(utuwa)」を「「utuwa1 = global.DuplicateDelete_Str(utuwa)」として使うかな?と思ったのですが、エラーになりました。
global.関数名とは、UWSCで定めている関数、例えばFOPENとかをクラス名内でglobal.FOPENというように使うのでしょうか?

global.関数名の意味を調べてみると、モジュール内からモジュール外関数を使うとまでは調べました。


[abc.uws]:呼び出し側
call C:\Users\mac\Desktop\uwsc\test\Test_global\RegularExpress.uws

r_fp = "C:\Users\mac\Desktop\uwsc\UwscClassParts\Test\RegularExpress\RowsPassOpenMatchValue.txt"

Pattern = "^.{1,5}"

arr = ArrayCreate(r_fp)

a = REGULAREXPRESS.RowsPassOpenMatchValue(arr,r_fp,Pattern)

print a

Function ArrayCreate(r_fp) // ファイル内テキストを各行をCRで区切り新配列作成fp_Array_6
fid = FOpen(r_fp)
str = FGet(fid, F_ALLTEXT)
Result = split(str, "<#CR>")
fclose(fid)
fend


[StringControl.uws]
CLASS STRINGCONTROL

Function DuplicateDelete_Str(str) // 重複行削除str_StringControl_23

HASHTBL hash = HASH_CASECARE

w_fp = GET_CUR_DIR + "\" + "tmp.txt"

fid = FOpen(w_fp, F_READ or F_WRITE8 or F_NOCR)
FPut(fid, str, F_ALLTEXT)
FClose(fid)
fid = fopen(w_fp,F_READ)


for i = 1 to fget(fid,-1)
hash[fget(fid,i)] = 1 //1はダミー
next

fclose(fid)

dim utuwa

for i = 0 to length(hash) -1
utuwa = utuwa + hash[i, HASH_KEY] + "<#CR>"
next
result = utuwa
fclose(fid)
fend


Function BlankRowDelete_Str(str) // 空白行削除:str_StringControl_8
pattern = "^(\s| )*(\r\n|\r|\n)"
Dim o_Reg = CreateOLEObj("VBScript.Regexp")
o_Reg.Global = TRUE
o_Reg.Multiline = TRUE
o_Reg.pattern = pattern
result = o_Reg.Replace(str,"")
fend

endclass


[RegularExpress.uws]
call C:\Users\mac\Desktop\uwsc\test\Test_global\StringControl.uws

CLASS REGULAREXPRESS

Function RowsPassOpenMatchValue(var arr[],r_fp,Pattern) // ファイル内の各行フルパスを開き、パターン一致でvalue取得_RegularExpress_12
dim utuwa
for i = 0 to Length(arr) - 1
Dim fid = FOpen(arr[i])
str = FGet(fid, F_ALLTEXT)
global.FClose(fid)
utuwa = utuwa + THIS.RegValue(str,Pattern) + "<#CR>"
next
utuwa1 = STRINGCONTROL.DuplicateDelete_Str(utuwa)
// STRINGCONTROL
utuwa1 = STRINGCONTROL.BlankRowDelete_Str(utuwa1)
result = utuwa1
fend


Function RegValue(str, Pattern, IgnoreCase=TRUE, Global=true) // Matches.Item(i).Value(マッチしたもの全てを結果に。)_RegularExpress_13
dim utuwa
o_Reg = CREATEOLEOBJ("VBScript.RegExp")
o_Reg.IgnoreCase = IgnoreCase
o_Reg.Global = Global
o_Reg.Pattern = Pattern
o_Reg.Multiline = TRUE
Matches = o_Reg.Execute(str)
for i = 0 to Matches.count-1
utuwa = utuwa + Matches.Item(i).Value + "<#CR>"
next
Result = utuwa
Fend

endclass

No.1655 2023/10/23(Mon) 10:17:09

Re: global.関数名に使い方について / stuncloud
globalを付けることでmodule(class)外で定義された関数を明示して呼び出せます
外部の関数と同名の関数をmodule(class)内で定義している場合に区別することができます
ので通常はあまり使うことはありません

Mod.test()

module Mod
 procedure test()
  global.msgbox("組み込み関数を呼ぶ")
  msgbox("モジュール内で定義したmsgboxを呼ぶ")
 fend
 function msgbox(msg)
  with createoleobj("WScript.Shell")
   result = .Popup(msg)
  endwith
 fend
endmodule

> [RegularExpress.uws]にある、RowsPassOpenMatchValue関数内の「utuwa1 = STRINGCONTROL.DuplicateDelete_Str(utuwa)」を「「utuwa1 = global.DuplicateDelete_Str(utuwa)」として使うかな?と思ったのですが、エラーになりました。
globalを付けられるのは通常の関数に対してです
module(class)メンバ関数はそれぞれ「module(class)名.関数名」で区別できるのでglobalのようなものがが必要ないですからね

No.1656 2023/10/23(Mon) 10:47:40

Re: global.関数名に使い方について / nanai
stuncloudさん、いつも簡潔で分かりやすい説明ありがとうございます。
globalの意味、理解できました。

No.1658 2023/10/23(Mon) 13:22:23
クラスファイルの管理、呼び出しについて / nanai
下記のスクリプトですが、callで4つのファイルを呼び出さないと「ArrCopy」関数が使えない状態です。
クラスファイルは、各カテゴリごとに作成しています、配列関係の関数は、「Array.uws」に格納みたいに。
クラスファイルの管理の仕方や呼び出しについて、先輩方はどのようにされていますでしょうか?

1. カテゴリーごとに分けずに、1つのクラスファイルを作成してそれを呼び出す、この場合に関数呼び出し時に何の関数かは関数名だけで判断しないといけない。
ex)
COMMON.KANSUU1

2. カテゴリーごとクラスファイルを分けて、クラスファイルに関数作成するときは他のクラスファイルの呼び出しをなるだけせずに関数の中身のコードを直に書く。


[abc.uws] 配列コピーする関数:ARRAYクラスファイルの「ArrCopy」関数利用

call GET_UWSC_DIR + "\Test_UwscClassParts\Array.uws"
call GET_UWSC_DIR + "\Test_UwscClassParts\FileControl.uws"
call GET_UWSC_DIR + "\Test_UwscClassParts\RegularExpress.uws"
call GET_UWSC_DIR + "\Test_UwscClassParts\StringControl.uws"

dim arr[] = "a", "b", "c"
dim arr1[-1]

ARRAY.ArrCopy(arr,arr1)

for aa in arr1
print aa
next
---------------------
[Array.uws] 試したことーエラーになった、関数の中に関数を使うことは多重エラー
Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]
str = ReadAlltext(r_fp)
dim i = 0
d = GetRowNum_File(r_fp)
fid = fopen(r_fp,F_READ)
resize(arr1, d - 1)
resize(arr2, d - 1)
for y = 1 to d
str = fget(fid,y)
arr1[i] = token(Delimiter,str)
arr2[i] = token(Delimiter,str)
i = i + 1
next
fclose(fid)

Function ReadAlltext(r_fp) // テキストを全て読込_FileControl_5
Dim fid = FOpen(r_fp)
Result = FGet(fid, F_ALLTEXT)
FClose(fid)
FEnd

Function GetRowNum_File(r_fp) // ファイルの行数取得_FileControl_6
fid = fopen(r_fp,F_READ)
row_total_number = fget(fid,-1)
Result = row_total_number
fclose(fid)
Fend

fend


↓↓↓↓ 解決案? クラスファイルの関数作成時、他のクラスファイルの関数呼び出しはなるだけ避けて直にコードを書く

Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]

Dim fid = FOpen(r_fp)
str = FGet(fid, F_ALLTEXT)
FClose(fid)

dim i = 0

fid = fopen(r_fp,F_READ)
row_total_number = fget(fid,-1)
d = row_total_number
fclose(fid)

fid = fopen(r_fp,F_READ)
resize(arr1, d - 1)
resize(arr2, d - 1)
for y = 1 to d
str = fget(fid,y)
arr1[i] = token(Delimiter,str)
arr2[i] = token(Delimiter,str)
i = i + 1
next
fclose(fid)
fend

---------------------
[Array.uws] 現在の状態
Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]で利用可能_Array_17
str = FILECONTROL.ReadAlltext(r_fp)
dim i = 0
d = FILECONTROL.GetRowNum_File(r_fp)
fid = fopen(r_fp,F_READ)
resize(arr1, d - 1)
resize(arr2, d - 1)
for y = 1 to d
str = fget(fid,y)
arr1[i] = token(Delimiter,str)
arr2[i] = token(Delimiter,str)
i = i + 1
next
fclose(fid)
fend
---------------------
[FileControl.uws] 現在の状態
Function ReadAlltext(r_fp) // テキストを全て読込_FileControl_5
Dim fid = FOpen(r_fp)
Result = FGet(fid, F_ALLTEXT)
FClose(fid)
FEnd


Function Getdpfn(r_fp,Parent = 0,ext = TRUE) // 親フォルダー取得と切替でファイル名拡張子取得_FileControl_4
Dim ptn_ext ; If ext Then ptn_ext = "" Else ptn_ext = "|\.[^\.]*?$"
Result = REGULAREXPRESS.RegReplace(r_fp, "^.*\\(([^\t\r\n]+?\\){" + Parent + "}[^\t\r\n]+?)(?=\\$|$" + ptn_ext + ").*?$", "$1")
FEnd


Function GetRowNum_File(r_fp) // ファイルの行数取得_FileControl_6
fid = fopen(r_fp,F_READ)
row_total_number = fget(fid,-1)
Result = row_total_number
fclose(fid)
Fend
---------------------
[RegularExpress.uws] 現在の状態
Function RegReplace(str,pat,replacestr=null) // 第3引数指定有:置き換え,第3引数指定無:testでパターン有無チェック、Global=true(デフォルト)_RegularExpress_15
Dim o_Reg = CreateOLEObj("VBScript.Regexp")
o_Reg.Global = TRUE
o_Reg.Multiline = TRUE
o_Reg.pattern = pat
Ifb replacestr = null
If o_Reg.Test(str) = 0 Then
result = FALSE
Else
result = TRUE
endif
Else
result = o_Reg.Replace(str,replacestr)
EndIf
FEnd


Function RowsPassOpenMatchSubMatch1(r_fp,Pattern) // ファイル内の各行フルパスを開き、パターン一致でsubmatchvalue取得_RegularExpress_11
Dim arr = ARRAY.ArrayCreate(r_fp)
dim utuwa
for i = 0 to Length(arr) - 1
str = FILECONTROL.ReadAllText(arr[i])
utuwa = utuwa + THIS.RegSubmatch(str,Pattern) + "<#CR>"
next
utuwa1 = STRINGCONTROL.DuplicateDelete_Str(utuwa) //重複削除
utuwa1 = STRINGCONTROL.BlankRowDelete_Str(utuwa1) //空行削除
result = utuwa1
fend
---------------------

No.1643 2023/10/19(Thu) 13:54:08

Re: クラスファイルの管理、呼び出しについて / しろまさ
必須ならARRAYクラスファイルの行頭に相対Call書くと
ARRAYクラスファイルを一つのみcallすれば良くなる。
相対Callは重複してもクラス多重定義にはならないですし。

call GET_UWSC_DIR + "\Test_UwscClassParts\Array.uws"
ちなみにこれ、
call Test_UwscClassParts\Array.uws
で通ると思いますが、いかがでしょう?

No.1644 2023/10/19(Thu) 15:18:32

Re: クラスファイルの管理、呼び出しについて / しろまさ
相対でフォルダ上がるときはこんな感じ。
call ../Test_UwscClassParts\Array.uws

No.1645 2023/10/19(Thu) 15:21:21

Re: クラスファイルの管理、呼び出しについて / nanai
しろまささん、うまくできましたありがとうございます。
Callのパス、相対パスでできるとは知らなかったです。
クラスファイルに関数作成するときに別のクラスの関数呼び出し使っていこうと思います。

[abc.uws]
call "..\Test_UwscClassParts\Array.uws"

dim arr[] = "a", "b", "c"
dim arr1[-1]

ARRAY.ArrCopy(arr,arr1)

for aa in arr1
print aa
next

[Array.uws]
call .\FileControl.uws
call .\RegularExpress.uws
call .\StringControl.uws

CLASS ARRAY

Procedure Filter(var arr[], expression)
~
fend

No.1646 2023/10/19(Thu) 17:20:37

Re: クラスファイルの管理、呼び出しについて / nanai
各クラスファイルの先頭に、そのクラスファイルの関数で使う別クラスのファイルパスを相対パスでしたのですが、エラーが出ました。これの原因とは、abc.uwsから FILECONTROLクラスを呼び出して、FILECONTROLクラスにある、関数からREGULAREXPRESSクラスファイルの関数を呼び出していることが原因でしょうか?

つまり、2階層の呼び出しはできないということでしょうか?
すみません、先輩方ご教授願いませんでしょうか?


[エラー内容]
23/10/20 11:33 型が合っていない or オーバーフロー C:\USERS\MAC\DESKTOP\UWSC\TEST_UWSCCLASSPARTS\ARRAY.UWS: 0行目: PROCEDURE C:\USERS\MAC\DESKTOP\UWSC\TEST_UWSCCLASSPARTS\ARRAY.UWS()


[abc.uws] 呼び出す側
OPTION LOGFILE = 4

call ..\Test_UwscClassParts\Array.uws

dim arr1[-1],arr2[-1]
r_fp = "C:\Users\mac\Desktop\uwsc\UwscClassParts\Test\Array\RowDelimiterArr2Create.txt"
Delimiter = ":"
ARRAY.RowDelimiterArr2Create(r_fp,Delimiter,arr1,arr2)

for a in arr1
print a
next


[Array.uws]
call .\FileControl.uws

CLASS ARRAY

Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]で利用可能_Array_17
str = FILECONTROL.ReadAlltext(r_fp)
dim i = 0
d = FILECONTROL.GetRowNum_File(r_fp)
fid = fopen(r_fp,F_READ)
resize(arr1, d - 1)
resize(arr2, d - 1)

for y = 1 to d
str = fget(fid,y)
arr1[i] = token(Delimiter,str)
arr2[i] = token(Delimiter,str)
i = i + 1
next

fclose(fid)

fend


Procedure ArrCopy(arr[], var copyarr[]) // 配列をコピーする_Array_8
ifb length(arr) > length(copyarr)
resize(copyarr, length(arr) - 1)
endif
for i = 0 to length(arr) - 1
copyarr[i] = arr[i]
next
fend


Function ArrayCreate(r_fp) // ファイル内テキストを各行をCRで区切り新配列作成fp_Array_6
fid = FOpen(r_fp)
str = FGet(fid, F_ALLTEXT)
Result = split(str, "<#CR>")
fclose(fid)
fend

endclass


[FileControl.uws]
call .\Array.uws
call .\RegularExpress.uws

CLASS FILECONTROL


Function FilesAlltextReplaceSeparate(fpFileList,replacePreviousNext,dp) // ファイル内の各行にあるフルパスを開き、置き換えファイルで指定した文字列で一括置き換え_FileControl_28
OPTION SPECIALCHAR

Dim arr = ARRAY.ArrayCreate(fpFileList) //フルパスの配列

Delimiter = "#" //「#」で区切る

dim arr1[-1], arr2[-1] //arr1:置き換えされる文字列,arr2:置き換え後文字列

ARRAY.RowDelimiterArr2Create(replacePreviousNext,Delimiter,arr1,arr2)


for i = 0 to LENGTH(arr) - 1 //全行数分
str = THIS.ReadAllText(arr[i])
for y = 0 to Length(arr1) - 1 //置き換え一覧
str = chgmoj(str, arr1[y], arr2[y])
next

fn = THIS.Getdpfn(arr[i])
fn = replace(fn, "origin", "replace")
print "fn:" + fn //test1_replace.txt
w_fp = dp + fn //別ファイルとして新規作成
THIS.WriteAllText(w_fp,str)
//COMMON.WriteAllText(arr[i],str) //既存ファイルに書換
next

result = true
fend


Function Getdpfn(r_fp,Parent = 0,ext = TRUE) // 親フォルダー取得と切替でファイル名拡張子取得_FileControl_4
Dim ptn_ext ; If ext Then ptn_ext = "" Else ptn_ext = "|\.[^\.]*?$"
Result = REGULAREXPRESS.RegReplace(r_fp, "^.*\\(([^\t\r\n]+?\\){" + Parent + "}[^\t\r\n]+?)(?=\\$|$" + ptn_ext + ").*?$", "$1")
FEnd


Procedure WriteAlltext(w_fp,str) // テキストを全て書込(上書き)_FileControl_5
fid = FOpen(w_fp, F_READ or F_WRITE8 or F_NOCR)
FPut(fid, str, F_ALLTEXT)
FClose(fid)
FEnd


Function ReadAlltext(r_fp) // テキストを全て読込_FileControl_5
Dim fid = FOpen(r_fp)
Result = FGet(fid, F_ALLTEXT)
FClose(fid)
FEnd


Function GetRowNum_File(r_fp) // ファイルの行数取得_FileControl_6
fid = fopen(r_fp,F_READ)
row_total_number = fget(fid,-1)
Result = row_total_number
fclose(fid)
Fend

endclass


[RegularExpress.uws]
CLASS REGULAREXPRESS

Function RegExe(str, Pattern, IgnoreCase=TRUE, Global=TRUE) // Matches基本_RegularExpress_9
Public o_Reg = CREATEOLEOBJ("VBScript.RegExp")
o_Reg.IgnoreCase = IgnoreCase
o_Reg.Global = Global
o_Reg.Pattern = Pattern
Matches = o_Reg.Execute(str)
Result = Matches
Fend

Function RegReplace(str,pat,replacestr=null) // 第3引数指定有:置き換え,第3引数指定無:testでパターン有無チェック、Global=true(デフォルト)_RegularExpress_15
Dim o_Reg = CreateOLEObj("VBScript.Regexp")
o_Reg.Global = TRUE
o_Reg.Multiline = TRUE
o_Reg.pattern = pat
Ifb replacestr = null
If o_Reg.Test(str) = 0 Then
result = FALSE
Else
result = TRUE
endif
Else
result = o_Reg.Replace(str,replacestr)
EndIf
FEnd

endclass



[StringControl.uws]
call .\RegularExpress.uws

CLASS STRINGCONTROL

Function BlankRowDelete_Str(str) // 空白行削除:str_StringControl_4
pattern = "^(\s| )*(\r\n|\r|\n)"
RESULT = REGULAREXPRESS.RegReplace(str,pattern,"")
fend

endclass

No.1647 2023/10/20(Fri) 11:43:03

Re: クラスファイルの管理、呼び出しについて / nanai
呼び出し側からArray.uwsを呼び出して、Array.uwsファイルの先頭に、「call .\FileControl.uws」を記述があり、FileControl.uwsに、「call .\Array.uws」の記述があったことが原因でした。
2重に、「Array.uws」を呼び出していたようです。

No.1648 2023/10/20(Fri) 12:11:29

Re: クラスファイルの管理、呼び出しについて / nanai
これだと「FileControl.uws」の先頭に、「call .\Array.uws」と記述ができず「「FileControl.uws」」内の関数に、Array.uwsのクラスに記述している関数が使えないです。これを改善する方法ありますでしょうか?
No.1649 2023/10/20(Fri) 12:25:43

Re: クラスファイルの管理、呼び出しについて / stuncloud
callするときに相対パスを記述する場合注意しなければならないのは、起点となるのはあくまで呼び出したメインスクリプトのパスであるということです
以下のような構成にした場合、lib.uws内でlib.uwsからの相対パスを記述した場合、main.uwsを呼び出すとエラーになる

- main.uws
 ```
 call libs\libs.uws

 Foo.p()
 Bar.p()
 Baz.p()
 ```
- libs
 - lib.uws
  ```
  // main.uwsからlib.uwsを呼ぶ場合は、main.uwsからの相対パスを指定する必要がある
  call libs\foo.uws
  call libs\bar.uws
  call libs\baz.uws
  // 以下のように書いた場合、main.uwsから見ると自分と同じフォルダを探してしまう
  // call foo.uws
  // call bar.uws
  // call baz.uws
  ```
 - foo.uws
  ```
  module Foo
   procedure p
   fend
  endmodule
  ```
 - bar.uws
  ```
  module Bar
   procedure p
   fend
  endmodule
  ```
 - baz.uws
  ```
  module Baz
   procedure p
   fend
  endmodule
  ```

循環参照による多重定義エラーに関してですが、相互に呼び合う必要があるのなら上記のlib.uwsのように他のすべてのファイルをcallするファイルをメインで呼ぶくらいしかないです
その方法であれば上記例ではlib.uwsさえcallすればすべての機能が使えることが保証されます
でなければメインから愚直に全部callするしかないです

もっと言うと、互いに互いのモジュール関数を呼び合ってるのが良くないので引数を工夫するとかですね
例えばARRAY.RowDelimiterArr2Createであれば、r_fpを受けてその中でFILECONTROL.ReadAlltext(r_fp)を呼んでいますが、FILECONTROL.ReadAlltext(r_fp)の戻り値を受けるようにします
> Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[])
> str = FILECONTROL.ReadAlltext(r_fp)
> dim i = 0
> d = FILECONTROL.GetRowNum_File(r_fp)

これを
> Procedure RowDelimiterArr2Create(all_text, rows, ,Delimiter,var arr1[],var arr2[])
> str = all_text
> dim i = 0
> d = rows

のように書き換えて、呼び出すときは
> all_text = FILECONTROL.ReadAlltext(r_fp)
> rows = FILECONTROL.GetRowNum_File(r_fp)
> ARRAY.RowDelimiterArr2Create(all_text, rows, delimiter, arr1, arr2)

とする
みたいな話です、こうやって他のモジュールへの依存をなくす方が筋がいいです

No.1650 2023/10/20(Fri) 14:55:23

Re: クラスファイルの管理、呼び出しについて / しろまさ
基本操作を管理するをlv1クラス群
lv1をcallし組み立てるlv2クラス群
などで循環参照にならないように管理するとか。

No.1651 2023/10/21(Sat) 03:54:32

Re: クラスファイルの管理、呼び出しについて / nanai
stuncloudさんありがとうございます、納得できました。

> callするときに相対パスを記述する場合注意しなければならないのは、起点となるのはあくまで呼び出したメインスクリプトのパスであるということです

この場合、呼び出される側のクラスファイルの先頭に呼び出す側を起点とした相対パスを書かないといけないので、呼び出す側のパスの位置が固定されるということですね、これは不便なので引数を工夫するのが良いと思いました。

ふと思ったのですけど関数の引数にファイルパスを指定するよりも、strなどの文字列を適用した方がいいかな?と、この考え方間違っているかもですけど!

No.1652 2023/10/21(Sat) 10:43:10

Re: クラスファイルの管理、呼び出しについて / nanai
しろまささん、ありがとうございます。
>基本操作を管理するをlv1クラス群
>lv1をcallし組み立てるlv2クラス群
>などで循環参照にならないように管理するとか。


上記だと設計を考える必要があるということですね、考慮してみます。

No.1653 2023/10/21(Sat) 10:45:23
chrome legacy window について / 藍
いつもお世話になれます。
chormeを利用してスクリプトを実行しています。
?@ id = GETID(" 商品マスタ - Google Chrome", "Chrome_WidgetWin_1", -1)
?A SLEEP(1)
?B CLKITEM(id, "商品マスタ取込", CLK_BTN)

たまにこのスクリプトが動かなくなり調べたら
?Bの部分が
  CLKITEM (id,"chrome legacy window",CLK_BTN)

"chrome legacy window"になってしまうのかわかりません。
なぜなのかわかりません。ご存じの方ご教授よろしくお願いします。

No.1638 2023/10/12(Thu) 08:07:16

Re: chrome legacy window について / stuncloud
何を聞かんとしているのかがわかりません
ボタン名が"商品マスタ取込"ではなく"chrome legacy window"になっている場合があるということですか?であれば以下で解決でしょう

if ! CLKITEM(id, "商品マスタ取込", CLK_BTN) then // 「商品マスタ取込」ボタン押下に失敗した場合
 CLKITEM (id,"chrome legacy window",CLK_BTN) // 「chrome legacy window」ボタンを押す
endif

> "chrome legacy window"になってしまうのかわかりません。
これが再現するコードを書いておく必要があります
確実に再現せずとも例えばそれを100回もやれば再現する場合がある、といった形でも構いません (その場合はその旨を明記してください)
少なくとも実際に現象が発生しているところを見れなければ誰も回答できないでしょう

> chrome legacy window
で調べたところAccessibilityに関連しているかもしれない?というようなことがわかりましたが詳細は不明です
また、Chrome上に「Chrome Legacy Window」というコントロールが存在しており、このコントロールのウィンドウクラスは「Chrome_RenderWidgetHostHWND」となっていておそらくボタンではありません
また、getitemでITM_ACCCLKやITM_ACCCLK2を見てみましたが該当するボタンは見つかりませんでした

No.1639 2023/10/12(Thu) 16:18:17

Re: chrome legacy window について / 藍
ご返事ありがとうございます。

この処理は2年ぐらい何事もなく動いていました。
1ヶ月前ぐらいから不安定な状態になりました。

なかなか再現しないのですがたまたま出たときに
UWSCの記録でその部分を作り直そうとした結果
  CLKITEM (id, "商品マスタ取込", CLK_BTN)
      ↓
  CLKITEM (id,"chrome legacy window",CLK_BTN)
  になっているのがわかりました。
  
ちなみにchormeの起動は
  path="C:\ProgramFiles\Google\chrome\Application\chrome.exe"
id = Exec(path + " --force-renderer-accessibility -process-per-tab --new-window " + URL)

もうちょと調べてみます。

No.1640 2023/10/12(Thu) 22:41:41

Re: chrome legacy window について / stuncloud
操作記録で出てきたコードなんですね
Chrome Legacy Windowに対してAccessibility ControlやUI Automation(UWSCで言うところのACCやUIA)によるアクセスができなくなるという不具合が潜在的なバグとしてかなり古いバージョンの頃からあったようです
おそらく現象再現時に記録を行った際、ACCまたはUIAによる検出ができずウィンドウ全体のコントロール名がボタン名として入ってしまったのではないか?と考えています、確証はないですが
多分なんですけどこうなったらChromeを再起動すべき(※)で、
- 「商品マスタ取込」ボタンのクリックに失敗した場合
- 事前にITM_ACCCLKで検査して該当ボタンの有無を確認してないことがわかった場合
などの状況であればChromeを終了しスクリプトを再実行するのが良いのではないでしょうか

※ 滅多に生じない現象のようなのでChromeを再起動することで解消するのではないか?という予想に基づいてます、実際はわかりませんが

No.1641 2023/10/13(Fri) 01:49:43

Re: chrome legacy window について / 藍
ご返事ありがとうございます。
助かります。
事前にITM_ACCCLKで検査して該当ボタンの有無を確認してないことがわかった場合
の処理を追加してみます。
今後ともよろしくお願いします。

No.1642 2023/10/13(Fri) 19:39:10
カテゴリーファイルの結合とカテゴリーに紐づいたサブカテゴリーの結合ファイル作成 / nanai
カテゴリーごとに、カテゴリー紐づいたサブカテゴリーを結合ファイルとして作成するスクリプトですが、カテゴリーが増えるごとに変数を作成していく必要があり、これを変数を作成しなくとも、結合ファイルを作成できるようにしたいです。

もっと、汎用的に使えるスクリプトに編集したいのですが、私の力だとアイデアが思いつきません。先輩方、ご教授願いませんでしょうか?

[InitSet.txt] // カテゴリー名
StringControl
RegularExpress
Array

StringControlには、サブカテゴリーがない為、空欄。
[InitSet_sub.txt] // カテゴリー名:サブカテゴリー名
StringControl:
RegularExpress:基本
RegularExpress:Executeメソッド
RegularExpress:Replaceメソッド
RegularExpress:Testメソッド
RegularExpress:SubMatches
Array:配列
Array:連想配列

[Summary.txt]
------------------StringControl
------------------RegularExpress
------------------Array
------------------------------------------------------
------------------StringControl
サブカテゴリーありません
------------------
内容1

---------------------
内容2

---------------------
内容3


---------------------
内容4

---------------------

------------------StringControl
------------------------------------------------------
------------------RegularExpress
\$ 基本
\$ Executeメソッド
\$ Replaceメソッド
---------------------
\$ 基本
---------------------

基本内容1
---------------------
基本内容2
---------------------
\$ 基本
---------------------
\$ Executeメソッド
---------------------
Executeメソッド内容

---------------------
\$ Executeメソッド
---------------------
\$ Replaceメソッド
---------------------
Replaceメソッド内容1


---------------------
Replaceメソッド内容2


---------------------
\$ Replaceメソッド
---------------------

------------------RegularExpress
------------------------------------------------------
------------------Array
\$ 配列
\$ 連想配列
---------------------
\$ 配列
---------------------
// 配列の内容
---------------------
\$ 配列
---------------------
\$ 連想配列
---------------------
連想配列

// 連想配列の内容

---------------------
\$ 連想配列
---------------------

------------------Array
------------------------------------------------------


[スクリプト]
// 「 InitSet.txt 」には、カテゴリー名の入力があること、「 InitSet_sub.txt 」には、カテゴリーに紐づいたサブカテゴリーの入力があることが前提

dn = replace(GET_UWSC_NAME, ".uws", "")

dp = GET_CUR_DIR + "\" + dn + "\Catogory\"

r_fpInitSetFile = GET_CUR_DIR + "\" + dn + "\InitSet.txt"
r_fpInitSetSubFile = GET_CUR_DIR + "\" + dn + "\InitSet_sub.txt"

w_fp = GET_CUR_DIR + "\" + dn + "\Summary.txt"
extension = ".uws"

dim AllCategorySubCategoryStrCancat
dim SubCategoryName1,SubCategoryName2,SubCategoryName3 // ここを増やしていかないといけない
dim SubCategorysAlltext

Delimiter1 = ":"

dim Category_arr[-1],SubCategory_arr[-1] // Category_arr:カテゴリー,SubCategory_arr:サブカテゴリー

RowDelimiterArr2Create(r_fpInitSetSubFile,Delimiter1,Category_arr,SubCategory_arr)


comment = ""
separate = comment + "------------------"
CategorySeparate = comment + "------------------------------------------------------"


InitSetFileStr = ReadALLText(r_fpInitSetFile) // catogory_メイン

delimiter2 = "<#CR>"
emptyflg = true
InitSet_Category_arr = split(InitSetFileStr, delimiter2, emptyflg) // InitSetにある各カテゴリー名を配列取得

dim SeparateCategoryStr

for aa in InitSet_Category_arr
SeparateCategoryStr = SeparateCategoryStr + separate + aa + "<#CR>"
next


for i = 0 to Length(InitSet_Category_arr) - 1

for x = 0 to length(Category_arr) - 1 // 各CatororyのSubCategoryを格納_現在3つカテゴリーまでしか機能しない

if InitSet_Category_arr[i] = Category_arr[x] then
if Category_arr[x] = InitSet_Category_arr[0] then // ここを増やしていかないといけない
SubCategoryName1 = SubCategoryName1 + SubCategory_arr[x] + "<#CR>"
elseif Category_arr[x] = InitSet_Category_arr[1] then
SubCategoryName2 = SubCategoryName2 + SubCategory_arr[x] + "<#CR>"
elseif Category_arr[x] = InitSet_Category_arr[2] then
SubCategoryName3 = SubCategoryName3 + SubCategory_arr[x] + "<#CR>"
elseif Category_arr[x] = InitSet_Category_arr[3] then
endif
endif
next
next


SubCategoryNameArr1 = split(SubCategoryName1, "<#CR>") // ここを増やしていかないといけない
SubCategoryNameArr2 = split(SubCategoryName2, "<#CR>")
SubCategoryNameArr3 = split(SubCategoryName3, "<#CR>")


dim utuwa1,utuwa2,utuwa3

if length(SubCategoryNameArr1) <> 1 then // ここを増やしていかないといけない
for z1 in SubCategoryNameArr1
utuwa1 = utuwa1 + "\$ " + z1 + "<#CR>"
next
endif

if length(SubCategoryNameArr2) <> 1 then
for z2 in SubCategoryNameArr2
utuwa2 = utuwa2 + "\$ " + z2 + "<#CR>"
next
endif


if length(SubCategoryNameArr3) <> 1 then
for z3 in SubCategoryNameArr3
utuwa3 = utuwa3 + "\$ " + z3 + "<#CR>"
next
endif



if length(SubCategoryNameArr1) <> 1 then // ここを増やしていかないといけない
SubCategoryName1 = utuwa1 + separate + "<#CR>"
endif


if length(SubCategoryNameArr2) <> 1 then
SubCategoryName2 = utuwa2 + separate + "<#CR>"
endif


if length(SubCategoryNameArr3) <> 1 then
SubCategoryName3 = utuwa3 + separate + "<#CR>"
endif



all = SubCategoryName1 + "#" + SubCategoryName2 + "#" + SubCategoryName3

arr1 = split(all, "#")


for i = 0 to Length(InitSet_Category_arr) - 1
r_fp = dp + InitSet_Category_arr[i] + extension // 各カテゴリーファイルフルパス
str = ReadAllText(r_fp) // 各カテゴリーファイル内容
str99 = trim(arr1[i])
if str99 = "" then
SubCategorysAlltext = SubCategorysAlltext + separate + InitSet_Category_arr[i] + "<#CR>サブカテゴリーありません<#CR>" + separate + "<#CR>" + str + "<#CR>" + separate + InitSet_Category_arr[i] + "<#CR>" + CategorySeparate + "<#CR>"
else
if i = 0 then
SubCategorysAlltext = SubCategorysAlltext + separate + InitSet_Category_arr[i] + "<#CR>" + str + "<#CR>" + separate + InitSet_Category_arr[i] + "<#CR>" + CategorySeparate + "<#CR>"
else
SubCategorysAlltext = SubCategorysAlltext + separate + InitSet_Category_arr[i] + "<#CR>" + str + "<#CR>" + separate + InitSet_Category_arr[i] + "<#CR>" + CategorySeparate + "<#CR>"
endif
endif
next


AllCategorySubCategoryStrCancat = SeparateCategoryStr + CategorySeparate + "<#CR>" + SubCategorysAlltext

WriteALLText(w_fp,AllCategorySubCategoryStrCancat)

procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) //ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]で利用可能_Array_17
str = ReadAlltext(r_fp)
dim i = 0
d = GetRow(r_fp)
fid = fopen(r_fp,F_READ)
resize(arr1, d - 1)
resize(arr2, d - 1)

for y = 1 to d
str = fget(fid,y)
arr1[i] = token(Delimiter,str)
arr2[i] = token(Delimiter,str)
i = i + 1
next

fclose(fid)
fend


Procedure WriteAlltext(w_fp,str) //テキストを全て書込(上書き)_FileControl_5
fid = FOpen(w_fp, F_READ or F_WRITE8 or F_NOCR)
FPut(fid, str, F_ALLTEXT)
FClose(fid)
FEnd


Function ReadAlltext(r_fp) //テキストを全て読込_FileControl_5
Dim fid = FOpen(r_fp)
Result = FGet(fid, F_ALLTEXT)
FClose(fid)
FEnd


Function GetRow(r_fp) //ファイルの行数取得_パス_FileControl_6
fid=fopen(r_fp,F_READ)
row_total_number=fget(fid,-1)
Result=row_total_number
fclose(fid)
Fend

No.1635 2023/10/10(Tue) 10:35:23

Re: カテゴリーファイルの結合とカテゴリーに紐づいたサブカテゴリーの結合ファイル作成 / stuncloud
サブカテゴリ名を入れる変数を可変長配列にすれば良いでしょう
UWSCの場合は連想配列が扱いやすい可変長配列なのでそれを利用します
コードを見る限りInitSet_Category_arrのインデックスがそのまま連想配列のキーとして使えそうなのでそのようにしています
詳細はリンク先を参照してください

https://gist.github.com/stuncloud/365be2619ddbaf1e913bc756aedb093b

わかりやすいようにdiffとしています
赤い部分が元のコードを修正して削除されたもの
緑が新しく書き加えられたコードです
コピペする場合は行頭の - や + に注意してください

可能な限り元のコードと同等の動きになるように書いているつもりですが、実際の動作に関しては未検証です

No.1636 2023/10/10(Tue) 13:49:26

Re: カテゴリーファイルの結合とカテゴリーに紐づいたサブカテゴリーの結合ファイル作成 / nanai
ありがとうございます、完璧に私の期待通りのスクリプトになりました。
これで、カテゴリーが増えた時に、変数を用意する必要がなくなりました。
連想配列の使いこなせるようになりたいと思いました。

No.1637 2023/10/11(Wed) 17:27:28
pos / seen
お世話になります。

文字列に指定文字列があるにもかかわらず、以下の1つ目が”ありません”、となります、理由がわかる方、ご教授ください、また、この場合、どう解決すればいいのでしょうか。

OK=1
京都="りんご表示"

ifb OK=1 AND POS("表示",京都)
print "あった"
else
print "ありません"
endif

ifb POS("表示",京都)
print "あった"
else
print "ありません"
endif

ifb OK=1 AND POS("りんご表示",京都)
print "あった"
else
print "ありません"
endif

No.1631 2023/10/03(Tue) 07:19:33

Re: pos / リキュール
京都="りんご表示"

print POS("表示",京都)

表示は4文字目なので結果は4が返ります。

No.1632 2023/10/03(Tue) 09:34:38

Re: pos / しゅん
// リキュールさんの回答で良い気もしますが、気が向いたので私も回答してみます。

// ヘルプにあるように、POS関数は見つかった場合1以上の数値が返ります。
// 見つかったか判定したいのであれば、0より大きいか比較すればOKです。

OK=1
京都="りんご表示"

// A)
ifb OK=1 AND POS("表示",京都)>0
  print "あった"
else
  print "ありません"
endif

// B)
ifb POS("表示",京都)>0
  print "あった"
else
  print "ありません"
endif

// C)
ifb OK=1 AND POS("りんご表示",京都)>0
  print "あった"
else
  print "ありません"
endif



// 以下余談

// 前提
// UWSCのANDやORは、論理演算ではなく、ビット演算です。
// IF文は、0以外で真、0で偽が実行されます。

// 実際評価。まずはC)
// 「OK=1」は、TRUEに評価され、内部値は1です。
// 「POS("りんご表示",京都)」は、1が返ります。元のように「>0」がなくても1のままAND演算に入ります。
// 1と1のANDは、1です。
// 元の場合でも、「あった」になります。

// 次B)
// 「POS("表示",京都)」は、4が返ります。
// 元の場合でも、4は0以外なので、「あった」です。

// 最後A)
// 上記B)、C)より、1と4のANDになります。
// ビット演算なので、それぞれ二進数3桁で表現すると、1は「001」、4は「100」で、ANDの結果は「000」です。
// これは0なので、「ありません」になります。

// おまけ
// ではここで京都の内容を「りんごす表示」にしてみましょう。

京都="りんごす表示"

ifb OK=1 AND POS("表示",京都)
  print "あった"
else
  print "ありません"
endif

// はい、お分かりかと思いますが、「りんごす表示」にした場合「POS("表示",京都)」は5が返ります。
// 5を二進数3桁で表現すると「101」、1とANDの結果は「001」になるため、「あった」になります。

// ま、こんなおまけはどうでも良くて、あるか見たいなら「>0」をつける、としてください。

No.1633 2023/10/04(Wed) 18:08:01

Re: pos / seen
詳しくわかりやすい解説ありがとうございます、りんごす!。
このおまけの内容がなかったら、私レベルの頭では理解できていませんでした。
今までの不具合の原因がすべて解決できました、本当にありがとうございました。

No.1634 2023/10/05(Thu) 21:11:18
UWSCRに関し質問 / ROM
「UWSC掲示板」が無くなりましたが、現在も”UWSC Pro”を使って、自動化の恩恵を受けている者です。
最近になって”UWSCR”の存在を知りました。
私が調べた範囲では、UWSCとの互換性を持ちながら様々な機能アップが行われ、継続して機能アップが期待できるようです。

しかし・・・・
UWSC Proの持つ、”RecIE”、"UDebug”、”Uws2Exe”、に相当する機能は、用意されているのか判然としません。

お手数ですが、情報をいただけたら幸いです。よろしくお願いします。

No.1627 2023/09/16(Sat) 16:47:46

Re: UWSCRに関し質問 / stuncloud
いずれも今のところありません

> RecIE
ChromeやMSEdgeを操作記録モードで起動し、操作をスクリプトとして出力する仕組みの実装は検討しています

> UDebug
Language Serverを実装予定なので、それに対応したVSCode拡張もリリースする予定があります
デバッガも可能であれば対応したいと考えています

> Uws2Exe
現時点では実現方法がわからないので保留中ですが、機能としては実装したいものではあります
実現に関する情報をお持ちの方がいたら教えていただきたいです

これらについては実装の方針や時期が決まり次第githubのwikiやdiscordで情報を公開していきます
https://github.com/stuncloud/UWSCR/wiki

No.1628 2023/09/16(Sat) 17:45:50

Re: UWSCRに関し質問 / ROM
ご回答ありがとうございます。

私としては、UDebug相当を希望しますが、UWSCの資産を引き継ぎながら、更に発展させるには大変な努力・知識がなければできないことであることは、容易に推察できます。

私は、高齢者で、ボケ防止として、毎日パソコンをつついています。
UWSCは大変重宝しています。
それと、stundcloudさんのページからは多くの知識をいただきました。ありがとうございます。

⇒”リブート”、良いですね。元気をいただきました。重ねてお礼申しあげます。

No.1629 2023/09/17(Sun) 10:00:52

Re: UWSCRに関し質問 / stuncloud
当面の目標はUWSCRのスクリプト実行機能を完成させバージョン1.0.0をリリースすることです
なので、先に挙げられた機能はどちらかといえば優先度の低いものとなるので、実装もまだ先になりそうです
気長にお待ちいただけたらと思います

No.1630 2023/09/17(Sun) 11:38:43
BusyWaitのSLEEPについて / とし

少し気になったので質問させてください。
下記のようなマクロでサイトを開くまでの BusyWait(IE) に SLEEP(0.001) を指定しているのですが、
この数値が早いことで相手のサーバに負荷がかかるということはないですよね?
私の理解ではIEの読み込み進行具合を確認しているだけで、例えばこの頻度で相手サーバーに残りデータはいくつか問い合わせているような処理はしてないですよね。


//////////

IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("https://www.yahoo.co.jp/")
BusyWait(IE)


//------
Procedure BusyWait(ie)
REPEAT
SLEEP(0.001)
UNTIL !IE.busy AND IE.readystate = 4
Fend

//////////

No.1624 2023/09/09(Sat) 21:56:24

Re: BusyWaitのSLEEPについて / stuncloud
BusyWait関数に関してはその理解で問題はありません
しかし、未だにIEを使い続けていることは問題であると断言できます
速やかに使用を中止すべきです

No.1625 2023/09/09(Sat) 23:45:02

Re: BusyWaitのSLEEPについて / とし
> BusyWait関数に関してはその理解で問題はありません
> しかし、未だにIEを使い続けていることは問題であると断言できます
> 速やかに使用を中止すべきです


ご回答ありがとうございます。
「IEを使い続けていることは問題」とはサポート終了していることによりセキュリティー的危険という意味でしょうか?
セキュリティー的にしっかりしたごく一部のサイトでしか使わないのでその点では大丈夫です。

No.1626 2023/09/10(Sun) 17:07:14
7-ZIPによる圧縮 / ROM
お世話になります。

複数のファイルを”7-ZIP”で、パスワード付きZIP圧縮したいと思っています。

ZIP圧縮に関して、ググったところ、以下を見つけました。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11165033606?__ysp=dXdzYyBaSVDlnKfnuK4%3D

中身の技術的な意味は全くチンプンカンプンですが、とりあえず成功しました。

しかし、7-ZIPの例は見当たりませんでした。

パスワードを付ける時、間違ったパスワードを付けてしまう危険性もあり、できることなら複数のファイルを所定の名前で圧縮し、更にパスワードを設定するところ までを希望しますが、どなたか知見のある方からご教授いただければ幸いです。

よろしくお願いします。

No.1617 2023/08/21(Mon) 10:22:02

Re: 7-ZIPによる圧縮 / RAM
ちんぷんかんぷんかも知れません。

sevenzip = "C:\Program Files\7-Zip\7z.exe"
pw = "password"
zip = "C:\hoge\fuga.zip"
txt_1 = "C:\hoge\fugafuga.txt"
txt_2 = "C:\hoge\piyopiyo.txt"

cmd = "<#DBL>@7z@<#DBL> a -p@password@ <#DBL>@zipfile@<#DBL> <#DBL>@sourcefile_1@<#DBL> <#DBL>@sourcefile_2@<#DBL>"

cmd = replace(cmd, "@7z@", sevenzip)
cmd = replace(cmd, "@zipfile@", zip)
cmd = replace(cmd, "@sourcefile_1@", txt_1)
cmd = replace(cmd, "@sourcefile_2@", txt_2)
cmd = replace(cmd, "@password@", pw)

doscmd(cmd)

No.1622 2023/08/23(Wed) 17:20:33

Re: 7-ZIPによる圧縮 / ROM
RAMさん

DOSCMDを利用する方法が簡単ですね!!
うっかりしていました!
ありがとうございました!!m(__)m

No.1623 2023/08/24(Thu) 17:42:58
JAVAアプリの制御について / みつ
お世話になります。

JAVAアプリから文字を取得したり、カーソルに文字を送ったりしたいのですが、
GETSTR や SENDSTR が動きませんので原因を教えて頂けないでしょうか。


JAVAアプリは、mcframeで名前の値は以下となっていました。
Java HotSpot(TM) 64-Bit Server VM
Java(TM) SE Runtime Environment


JavaAccessBridgeとJRE(32bit) はインストール済で、試したコードは以下になります。

//1
id = GETID("メイン-mcframe","SunAwtFrame",-1)
dim name[] = "ボタン", "リスト/コンボ", "タブ", "メニュー", "ツリービュ", "リストビュ", "エディト", "スタテック文字", "ステータスバー", "ツールバー", "ACCクリック可", "ACCテキスト", "ACCエディト"
dim kid[] = ITM_BTN, ITM_LIST, ITM_TAB, ITM_MENU, ITM_TREEVEW, ITM_LSTVEW, ITM_EDIT, ITM_STATIC, ITM_STATUSBAR, ITM_TOOLBAR, ITM_ACCCLK, ITM_ACCTXT, ITM_ACCEDIT
for x = 0 to Length(name)-1
print name[x]
for n in GETITEM(id, kid[x], -1)
print " " + n
next
print
next


//2
While True
  x = G_MOUSE_X; y = G_MOUSE_Y
  id = GETID(GET_FROMPOINT_WIN)
  ofx = x - STATUS(id, ST_CLX)
  ofy = y - STATUS(id, ST_CLY)
wks = PosACC(id, ofx, ofy)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_NAME)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_VALUE)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_ROLE)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_STATE)
wks = wks + "<#cr>" + "x="+ofx+", y="+ofy
  Fukidasi(wks, x+10, y+10, 3)
  Sleep(0.5)
Wend


//3
id = GETID("メイン-mcframe","SunAwtFrame",-1)
SendStr(id, "111", 1, True, True)
SendStr(id, "222", 3, True, True)
SendStr(id, "444", 4, True, True)


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

No.1621 2023/08/22(Tue) 17:09:23
UWSCRでのWeb関連操作について / レフト
どうにもわからなかったので教えてください。
私がquerySelectorの理解を出来ていないという事なのかも知れないのですが、
UWSCRで以下を実行すると検索キーである「hoge」が保持されず検索ボタンだけクリックされてしまいます。
バージョンはuwscr 0.12.1 chkimg です。

---
chrome = BrowserBuilder(BC_CHROME)_
.profile("C:\uwscr\chrome\profile1")_
.start()

chrome = BrowserControl(BC_CHROME)

tab = chrome.tabs[0]
tab.navigate("https://www.yahoo.co.jp/")

document = tab.document
document.querySelector("input[type='search']").value = "hoge"
document.querySelector("button[type='submit']").click()
---

ブラウザ上で「hoge」が入力されている事は視認できるのですが、
検索ボタンをクリックするとクリアされてしまうイメージです。

なお、UwscWebDriverを使用して、UWSCで以下を実行した場合は
問題なく「hoge」を検索する事ができました。

---
call UwscWebDriver.uws
driver = WebDriver.Chrome()

driver.Navigate("https://yahoo.co.jp/")
driver.FindElement( By.Tag("input") + By.Attribute("type", "search") ).SetValue("hoge")
driver.FindElement( By.Tag("button") + By.Attribute("type", "submit") ).Click()
---

No.1618 2023/08/21(Mon) 13:17:25

Re: UWSCRでのWeb関連操作について / stuncloud
開発者ツール(F12)で同様のことをしても再現するので、Yahoo側の仕様でinputのvalueを変更しただけだとだめっぽいですね
なので手入力を偽装するためにkbd関数を使うようにしたところうまく検索できました

document = tab.document
search = document.querySelector("input[type='search']")
search.value = "" // 検索ボックスを事前に空にしておく
search.focus() // 検索ボックスをフォーカス
kbd("hoge") // hogeを入力
document.querySelector("button[type='submit']").click()



UwscWebDriverのSetValueが成功するのは入力方式が異なるからですね
具体的にどのようなことをしているのかわかりませんが、WebDriverがキーボードをエミュレートしてるなど手入力に近いことをしているのではないかな
WebDriverの動作に近いことができないか検討してみます
ちなみにBRSetDataという関数もありますが、現状これもvalue値を直接書き換えてるだけなので同じ現象が起きます

No.1619 2023/08/21(Mon) 13:56:38

Re: UWSCRでのWeb関連操作について / レフト
stuncloudさん

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

>Yahoo側の仕様でinputのvalueを変更しただけだとだめっぽいですね
サイトの仕様だったのですね。
実際にはYahooで検索したい訳ではなく他サービスサイトへのログインの利用目的でした。
複数サイトで確認されたので、そういったパターンは多いのかも知れませんね。

今後の実装もご検討いただけるとのこと、ありがとうございます。

なお例示いただいたフォーカスした後のkbdで直接入力した場合は
どちらのサイトでも問題なく動作することは確認いたしました。

No.1620 2023/08/21(Mon) 15:32:41

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

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

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

Rocket Board Type-X (Free) Rocket BBS