FILEMAKER プラグイン など (助け合い)フォーラムにようこそ!
何方でも、ご質問・ご回答お願いします。
※2024/01/31 までに登録された方は、登録時のパスワードが使えません。
パスワードを再発行してください。
いつもお世話になります。
ご質問よろしくお願い申し上げます。
環境
FM13AD WIN10 selenium クローム powershell ScriptMakerPS
自社のサイトを先日、HTTP:からHTTPS:に変更をいたしました。
ScriptMakerPSでWEBページの管理画面でベーシック認証をいままで
していたのですが、できなくなりました。
下記にように記述しております。
"https://username:password@www.abc.jp"
やはりセキュリティの関係で認証は難しいでしょうか?
それとも他の方法がございますか?
ぜひ教授教いただけないでしょうか?
宜しくお願い申し上げます。
お世話になります。
先ほど、下記を試して見ました。
Event を送信 [「aevt」; 「odoc」; "FMぷりんのパス" "set;xmlファイルパス"]
例:Event を送信 [「aevt」; 「odoc」; "C:\FMPrin.exe" "set;C:\Prin.xml"]
これで印字が手動でできるようになりました。
スクリプトを下記に戻して印刷をしました。
[Eventを送信]でQuote ( "C:\FMPrin3.exe" ) & " " & Quote ( "C:\Untitled.xml" )
印刷 [] (ダイアログなしで実行は、OFF)
この手順で印刷をしたところ、無事に元の状態に戻すことができました。
お騒がせして、失礼いたしました。
解決です。ありがとうございました。
いつもお世話になっております。
ご質問させてください。
宜しくお願い申し上げます。
■環境
FMAD13 windows10 pro64bit FMPrin5
先日、windows7からwindows10にバージョンアップしてからFMPrin5を導入して
NEC Multilmpact700JX3nのプリンターの印字ができるようになりました。
ありがとうございます。
その後、brotherのPT-9700PCという、ラベルプリンターを導入しました。
このbrotherのPT-9700PCの印刷後にNEC Multilmpact700JX3nを印刷すると
印刷の不具合が起きました。
不具合は信号が送られているようなのですが、印字が10文字程度しか印字されない状態で
ストップしてしまうのです。何度やっても同じ状態です。
私の方で改善を試みた内容を記載いたします。
1、再起動
2、brotherのPT-9700PCのドライバーのアンインストール
3、NEC Multilmpact700JX3nポートの再設定
4、NEC Multilmpact700JX3nポートの切り替え
5、NEC Multilmpact700JX3nからのテスト印刷→メモ帳からの印刷はできました。
(NECに問い合わせをして上記を試みたのですが、恐らくファイルメーカー側でないかとの指摘です。)
6、システムの復元
(これで一度改善されました。ただ、もう一度試みたのですが、復元ポイントがないため、現在できない状態です。)
■プリンターの環境
・NEC Multilmpact700JX3n→共有設定(LAN)
・brotherのPT-9700PC→USB経由でPCに接続
原因はbrotherのPT-9700PCを使用したことによって起こっているのは分かっておりますが
再起動や削除しても、NEC Multilmpact700JX3nが使えない理由がわかりません。
何かよい方法はないでしょうか?
お手数となりますが、ご教授のほどよろしくお願い申し上げます。
お世話になります。
早速なご回答ありがとうございます。
また、私が大切なことを忘れておりました。
Seleniumの準備で「セキュリティ:ブロックの解除」の確認を忘れておりました。
下記の部分です。
http://qbxxdp.blogspot.com/2016/08/file … meweb.html
※重要
「セキュリティ:ブロックの解除」の確認。
「C:\WebDriver\selenium\net40」フォルダを開き、すべてのファイルの「ブロックの解除」を行ってください。
今回は、「net40」ファルダの方を使用します。
「C:\WebDriver\chromedriver_win32」フォルダ内の「chromedriver.exe」も同様に「ブロックの解除」を行ってください。
ブロックの解除を行ったところ、問題なく、ブラウザの起動ができました。
お騒せして申し訳ございません。
Google Chrome のバージョンもChromeDriver 74.0.3729.6に変更してみます。
いつも早急なご対応をいただき大変感謝いたします。
今後とも宜しくお願い申し上げます。
いつもお世話になります。
ご無沙汰しております。
この度もよろしくお願い申し上げます。
環境
FM13AD WIN7 selenium クローム powershell
ScriptMakerPSを使用しようとしたところ、急にブラウザが起動しなくなりました。
いつものようにFMを起動をして、ブラウザを起動するスクリプトを実行したところ
ブラウザが起動しませんでした。
以前、下記質問をしておりますが、下記内容も更新しました。
https://fm-aid.com/community/viewtopic.php?id=16
【更新した内容】
■ChromeDriver を最新(2.46)
■Seleniumを最新(3.5.2)
更新をしたのですが、改善されませんでした。
今回使用していたPCは週1回程度、起動させて、ScriptMakerPSを使用するのは月に2,3回程度でした。
ただ、仕事で使用しているPCでは、問題なく、動作をしております。
仕事のPCは自動更新を切っております。
今回、起動できないPCは自動更新をしております。
なにか関係がありますでしょうか?
また、通常使用しているグーグルクロームは本日、自動更新されておりました。
通常使用しようしているグーグルクロームとはChromeDriverではなく、一般的に使用しているグーグルのブラウザです。
こちらも関係しておりますでしょうか?
グーグルクロームの更新の関係でしょうか?
お時間のあるときにご返答いただけますと助かります。
お手数をおかけいたしますが、ご教示のほどよろしくお願い申し上げます。
お世話になります。
ご返信が大変遅くなりました。
コメントのご指摘ありがとうございます。
また、初歩的なことでご丁寧にご指導いただきましてありがとうございます。
ただ、コメントを正しくしても、うまく動作しませんでした。
いろいろと模索した結果、いくつか修正しないと動作しませんでした。
修正をしたのはシングルクォーテーションの部分を変数にして、変数の値は
別途フィールドを作成して、そこに値を入れました。
パスワードと同じ設定です。
また、スクリプトを分けて、動作させました。
成功した内容を記述いたします。
-------------------------------------------------------------------------------------
Let([
Script=
"
$Username = '{Username}';
$Password = '{Password}';
$url = '{url}';
$n = '{n}';
$match = '{match}';
$wr = [System.Net.WebRequest]::Create($url);
$wr.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$wr.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory;
$res = $wr.GetResponse();
$rs = New-Object System.IO.StreamReader($res.GetResponseStream());
$list = $rs.ReadToEnd();
$arrey=$list.Split($n);
$matches = $arrey -notmatch $match;
$matches | Sort-Object | Select-Object -Last 1;
"
;Script=Substitute ( Script ;
["{Username}" ; $Username ]
;["{Password}" ; $password]
;["{url}" ; $url]
;["{n}" ; $n]
;["{match}" ; $match]
)
];
SMPS_Exe( Script )
)
---------------------------------------------------------------------------------------
変数を設定でスクリプトを分けております。
二つ目は下記、記述です。
---------------------------------------------------------------------------------------
Let([
Script=
"
$Username = '{Username}';
$Password = '{Password}';
$url = '{url}';
$path = '{path}';
$str=ConvertTo-SecureString $Password -AsPlainText -Force;
$cred=New-Object System.Management.Automation.PSCredential($Username,$str);
Invoke-WebRequest -Uri $uri -OutFile $path -Credential $cred;
"
;Script=Substitute ( Script ;
["{Username}" ; $Username ]
;["{Password}" ; $Password]
;["{url}" ; $url]
;["{path}" ; Substitute ( Replace ( Get ( デスクトップパス ) ; 1 ; 1 ; "" ) ; ["/" ; "\\"] ; ["Desktop\\" ; ""] ) & "Downloads\filename.csv"]
)
];
SMPS_Exe( Script )
)
---------------------------------------------------------------------------------------
このように記述して、うまく動作することができました。
ありがとうございます。
また、今回なぜこれを必要としていたかと申し上げますと
楽天の商品登録で必要となりました。
商品を毎日出品しておりますが、まだ楽天に登録されていない商品を
ファイルメーカーに取り込むために必要でした。
通常はコントロールカラム「u」で更新ができるのですが、登録されていないと
楽天のログファイル「ritem/logs/」にその情報が残ります。
このファイルをダウンロードするためでした。
これで更新と新規商品の登録が半ば、自動的に登録できるようになりました。
ありがとうございます。
理解するのに時間がかかりますが、できあがると本当に便利ですね。
PowerShellを理解するのに難易度は上がりますが、がんばって参ります。
この度も丁重にご指導をいただきまして本当にありがとうございました。
感謝いたします。
ご回答ありがとうございます。
上記の記述で問題なく、最後のファイル名を取得できました。
powershell ISE上で確認ができました。
ありがとうございます。
上記の内容を含め、ファイルメーカー+powershellの記述をしました。
ですが、記述が違うのかダウンロードができませんでした。
$url2の値が取得できていないようなのです。
-------------------------------------------------------------------------------
Let([
Script=
"
$Url = '{Url}';
$Username = '{Username}';
$Password = '{Password}';
$wr = [System.Net.WebRequest]::Create($Url);
$wr.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$wr.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory;
$res = $wr.GetResponse();
$rs = New-Object System.IO.StreamReader($res.GetResponseStream());
$list = $rs.ReadToEnd();
# 「item-cat.」を除外した昇順の最後のファイル名(csvファイル)を取得
$arrey = $list.Split('`n');
$matches = $arrey -notmatch 'item-cat.';
$url2 = $matches | Sort-Object | Select-Object -Last 1;
# Invoke-WebRequestを使用して上記のファイル($url2)をダウンロード
$str=ConvertTo-SecureString $password -AsPlainText -Force;
$cred=New-Object System.Management.Automation.PSCredential($Username,$str);
Invoke-WebRequest -Uri 'ftp://upload.abc.ne.jp/ritem/logs/$url2' -OutFile 'C:\Users\xps\Downloads\filename.csv' -Credential $cred;
"
;Script=Substitute ( Script ;
["{Username}" ; $Username ]
;["{Password}" ; $password]
;["{Url}" ; $Url]
)
];
SMPS_Exe( Script )
)
-------------------------------------------------------------------------------
ダブルクォーテーションやシングルクォーテーションの記述が異なりますか?
それとも$Urlの値の入れ方が異なりますか?
powershell ISE上ではpowershell ISEの記述方法でダウンロードすることができました。
大変お手数となりますが、ご教授のほど宜しく願い申し上げます。
ご回答をいただきましてありがとうございます。
また、単純なミスをしておりました。
「FileMakerのスクリプト内の計算式に記述する場合は、行末に ; が必要です。」
のことを今後気をつけて参ります。
行末に ; をつけたところ、ファイルメーカー+powershellで動作確認できました。
ありがとうございます。
また、ご指摘のとおり、Invoke-RestMethodではファイル名の一覧を取得することはできませんでした。
そこでご参考をいただいた下記から、ファイルの一覧をpowershell ISE上で表示できました。
https://qiita.com/sengoku/items/d214e7a8d1e399b42b18
表示できたのですが、ここからが難題でいろいろと調べたのですが、型やパイプなど理解できないでおり
最後のファイル名を取得する方法がわからない状態です。
最後のファイル名だけ、抽出するにはどのような記述となりますでしょうか?
ファイル名だけ取り出せれば、下記記述を利用してダウンロードができます。
「Invoke-WebRequest -Uri 対象URI -OutFile 保存するローカルパス」
「対象URI」の部分に最後のファイル名だけわかれば、解決できそうです。
例:item20180903.csv
ファイル名の抽出ができればよいのですが、.NETなのかpowershell なのか混乱しております。
お手数となりますが、ご教授のほど宜しくお願い申し上げます。
環境
WIN7 FM13AD powershell
いつもお世話になります。
宜しくお願い致します。
ファイルメーカーとpowershellを使用して、
FTPで接続後、最後のcsvファイルをダウンロードする方法について教えてください。
powershellで下記の記述により、ファイルをダウンロードするところまでできました。
------------------------------------------------------------------------------------------------------
# パスワード等を設定
$user ='abc'
$password = '123456'
$url = 'ftp://upload.abc.ne.jp'
# FTP認証 Nework.CredentialではなくPSCredentialを使用
$str=ConvertTo-SecureString $password -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($user,$str)
# データのダウンロード
Invoke-WebRequest -Uri "$url/ritem/logs/item.20180825215009598.csv" -OutFile "C:\Users\xps\Downloads\filename.csv" -Credential $cred
--------------------------------------------------------------------------------------------------------
ただ、-Uriの指定で個別のファイルを指定してダウンロードはできるのですが
最後のファイルをダウンロードすることができません。
どのように記述すればよろしいでしょうか?
下記のように記述をしてみたのですが、エラーがでます。
Invoke-RestMethod -Uri "$url/ritem/logs/" | Select-Object -Last 1
パイプの使い方や変数の使い方がわかりません。
この部分の正しい記述を教えていただけますと助かります。
また、上記はpowershellだけの記述となります。
ファイルメーカー+powershellで動作させたいと考えております。
下記のように作成してみましたが、うまく動作しませんでした。
どこの記述がおかしいでしょうか?
---------------------------------------------------------------------------------------------------
Let([
Script=
"
$Username = '{Username}';
$Password = '{Password}';
$str=ConvertTo-SecureString $password -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($Username,$str)
Invoke-WebRequest -Uri 'ftp://upload.abc.ne.jp/ritem/logs/item. … 009598.csv' -OutFile 'C:\Users\xps\Downloads\filename.csv' -Credential $cred
"
;Script=Substitute ( Script ;
["{Username}" ; $Username ]
;["{Password}" ; $password]
)
];
SMPS_Exe( Script )
)
-----------------------------------------------------------------------------------------------------------------------
いろいろと長く記述して申し訳ございません。
ご教授いただけますと幸いです。
宜しくお願い申し上げます。
ありがとうございます。
ご教授いただきましたとおり、URLがわかりましたので
下記のとおり、記述したところ、ダウンロードしたPDFを印刷することができました。
$element = $driver.FindElement([OpenQA.Selenium.By]::xpath('//input[@value=\"出力\"]'));
$element.Click();
Start-Sleep -m 1000;
$driver.Navigate().GoToUrl(\"file:///{path}Downloads/invoice.pdf\");
$driver.ExecuteScript('window.print();');
Start-Sleep -s 1;
$element = $driver.FindElement([OpenQA.Selenium.By]::xpath('//button[text()=\"印刷\"]'));
$element.Click();
URLを取得できれば、PDFも印刷可能ですね。
これで業務の効率化がまた進みました。
いつも、的確で安心できるご対応に感謝いたします。
今後ともよろしくお願い申し上げます。
この度もお世話になります。
よろしくお願い申し上げます。
環境FM13 WIN7 クローム
#selenium,#PowerShell
ヤフーオークションのストア画面で取引伝票を
印刷する方法を教えてください。
一括処理から「取引伝票」を選択して、「出力」ボタンを押すと
下のダウンロードバーにPDFがダウンロードされます。
このダウンロードされたファイルをクリックしたいのですが
HTMLの「検証」を押して、ソースを調べることができません。
ダウンロードバー専用の記述などございますでしょうか?
立て続けのご質問となり、申し訳ございません。
ご教授のほどよろしくお願い申し上げます。
ありがとうございます。
ご提示いただいた下記内容で印刷ができました。
補足で「text()="印刷"」の部分の¥マークが抜けていたので
下記内容に修正して印刷することができました。
$driver.ExecuteScript('window.print();');
Start-Sleep -s 1;
$wid =$driver.WindowHandles; <#ウインドウにハンドルを取得#>
$newWindow=$driver.SwitchTo().Window($wid[-1]); <#最後に開いたウインドウに移動#>
$element = $driver.FindElement([OpenQA.Selenium.By]::xpath('//button[text()=\"印刷\"]'));
$element.Click();
ありがとうございます。
これで楽天の自動化が進みます。
AIなくても #selenium,#PowerShell で完全自動化を目指します。
この度もご丁寧にご対応くださり、ありがとうざいました。
感謝いたします。
お世話になります。
早急なご回答ありがとうございます。
また、詳しくご説明をいただきありがとうございます。
下記のように記述してみました。
$wid =$driver.WindowHandles; <#ウインドウにハンドルを取得#>
$newWindow=$driver.SwitchTo().Window($wid[-1]); <#最後に開いたウインドウに移動#>
$elements = $driver.FindElementById('print');<#印刷ボタンをクリック#>
$elements[0].Click();
$newWindow=$driver.SwitchTo().Window($wid[0]); <#最初のウインドウに移動#>
ウインドウの移動は成功したのですが、印刷ボタンがクリックされませんでした。
印刷ボタンの部分は下記のように試してみました。
$elements = $driver.FindElementById('print');
$elements[0].Submit();
$elements = $newWindow.FindElementById('print');
$elements[0].Click();
$elements = $newWindow.FindElementById('print');
$elements[0].Submit();
$elements = $driver.FindElementById('print');
$hack =$elements.LocationOnScreenOnceScrolledIntoView;
$Y=$hack[0].Y;
$driver.ExecuteScript(\"window.scrollTo(0, $Y);\");
$elements[0].Click();
いづれも、クリックがされませんでした。
何かハンドルをつかんだ状態にしていないとクリックされないのでしょうか?
プリントのアイコンが見え隠れする状態がクリックできない原因でしょうか?
大変お手数となりますが、ご教授のほどお願い申し上げます。
いつもお世話になります。
よろしくお願い申し上げます。
環境FM13 WIN7 クローム
現在、楽天のRMSから伝票を印刷したいと考えております。
顧客を選択した後、「PDF」を開くボタンを押すと、新しいウインドウで印刷画面が表示されます。
ここでご教授いただきたい内容は次のとおりです。
1、新しいウインドウにハンドルを移したい。
2、PDFから印刷をしたい。
3、元のRMSのウインドウに戻り、処理を続けたい。
私が考えている内容を記載いたします。
1、新しいウインドウにハンドルを移したい。
【言語:Ruby】
window = driver.window_handles.last # ウィンドウ情報を取得
driver.switch_to.window(window) # 遷移先のウィンドウに遷移元のウィンドウ情報を移す
【言語:C#】
var handle = Process.GetCurrentProcess().MainWindowHandle;
var owner = Control.FromHandle(handle);
調べてみたのですが、私には難しく正しい記述がわかりません。
正しい記述をご教授いただけますと、助かります。
2、PDFから印刷をしたい。
こちらの問題としてはウインドウがPDFに移った場合、アイコンが
表示されていないので、印刷ボタンが押せるかがわりません。
私なりに記述した内容を記載いたします。
【HTML】
<paper-icon-button id="print" icon="cr:print" role="button" tabindex="0" aria-disabled="false" title="印刷" aria-label="印刷">
</paper-icon-button>
【selenium側】
$elements = $driver.FindElementsById('print');
$elements[0].Click();
もし、印刷ボタンが表示されていないと、印刷ができない場合は
表示させる記述も教えていただけますと大変助かります。
3、元のRMSのウインドウに戻り、処理を続けたい。
こちらも調べましたが、言語が違う記述ですみません。
【Java】
String wid = driver.getWindowHandle(); #元のWindowHandleを取得しておく
driver.switchTo().window("ここに新しいWindow名"); #別Window切り替え
driver.switchTo().window(wid); #元のWindowへ切り替え
ご質問させていただいた内容では「元のウインドウ」→「新しいウインドウ」→「元のウインドウ」を希望しておりますが
もし、「元のウインドウ」だけで済むようであれば、その方法でもよいかと考えております。
今回は質問内容が多くて、申し訳ございません。
ご教授いただけますと幸いです。
よろしくお願い申し上げます。
いつもお世話になります。
ご質問させてください。
よろしくお願いいたします。
環境
FM13AD WIN7 selenium クローム powershell
下記ソースのボタンをクリックしたいのですが、クリックができません。
<SMALL>
<INPUT TYPE="BUTTON" VALUE="ダウンロード" onClick="javascript:bulkFunc('show/download?mode=terms&crumb=V_x3Z8Tpg9NypLpaj_bNdQ--')">
</SMALL>
こちらで次の記述をしてみました。
■例1
$elements = $driver.FindElement([OpenQA.Selenium.By]::xpath('//button[value()=\"ダウンロード\"]'));
$elements[0].Click();
■例2
$elements = $driver.FindElement([OpenQA.Selenium.By]::xpath('//input[value()=\"ダウンロード\"]'));
$elements[0].Click();
■例3
$elements = $driver.FindElement([OpenQA.Selenium.By]::xpath('//input[onClick=\"javascript:bulkFunc\”]'));
$elements[0].Click();
■例4
$elements = $driver.execute_script('show/download?mode=terms&crumb=V_x3Z8Tpg9NypLpaj_bNdQ--');
$elements[0].Click();
Click()をSubmit()に変更してもクリックされませんでした。
大変お手数となりますが、ご教授のほどよろしくお願い申し上げます。
新年明けましておめでとうございます。
今年もよろしくお願い申し上げます。
解決が年を跨いでしまいました。
ご教授いただきました下記の件を確認しました。
・ファイルパスの確認
こちらはパスを確認したのですが、合っておりました。
また、他のPCからフォルダごと移動しましたが、それでもだめでした。
・32bitのPowerShellをインストール
こちらはPCが64bitだったため、32bitを選択して、インストールすると
インストールができない旨のメッセージが表示され、インストールできませんでした。
ネットで検索すると、どうやら、64bitをインストールすると32bitもインストール
されていると、ネット上で記載がございました。
上記の2つで解決ができなかったため、色々と検索をしていて気づいたのですが、
今回のPCのみ、まだ、グーグルクローム自体がインストールされておりませんでした。
グーグルクロームをインストールしたところ、無事に起動ができました。
グーグルクロームを最初にインストールしてから、設定しないとだめだったんですね。
大変お騒がせいたしました。
本年もご指導のほどよろしくお願い申し上げます。
ありがとうございました。
いつもお世話になります。
ご質問させてください。
よろしくお願い申し上げます。
環境
Windows7 home premium Service pask1 64ビット
FM12 AD
スクリプトメーカーPSの設定時のご質問となります。
現在3台設定をして、もう一台設定をしているところです。
環境は上記の環境となります。
power shellを使用できるか確認をしたところ下記のエラーが表示されました。
↓↓↓↓↓↓↓↓↓
PS C:\Windows\system32> Add-Type -Path "C:\WebDriver\selenium\net40\WebDriver.dll" ;
Add-Type -Path "C:\WebDriver\selenium\net40\WebDriver.Support.dll" ;
$chromedriver_path = "C:\WebDriver\chromedriver_win32\" ;
$driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver ($chromedriver_path);
$driver.Navigate().GoToUrl("https://www.amazon.co.jp/");
New-Object : "1" 個の引数を指定して ".ctor" を呼び出し中に例外が発生しました: "unknown error: cannot find Chrome binary
(Driver info: chromedriver=2.24.417431 (9aea000394714d2fbb20850021f6204f2256b9cf),platform=Windows NT 6.1.7601 SP1 x86_64)"
発生場所 行:7 文字:11
+ $driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver ($chromedriver_path);
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object]、MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
null 値の式ではメソッドを呼び出せません。
発生場所 行:9 文字:1
+ $driver.Navigate().GoToUrl("https://www.amazon.co.jp/");
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) []、RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
PS C:\Windows\system32>
↑↑↑↑↑↑↑↑↑↑
PowerShellは3.0です。
下記のURLの説明にある
http://qbxxdp.blogspot.jp/2016/08/filem … meweb.html
64-bit versions: Windows6.1-KB2506143-x64.msuの部分をインストールしております。
■その他設定をしたものを記載いたします。
ChromeDriver - WebDriver for Chromeは最新のものに変更しました。
Selenium は2.53.1.0のままです。
net40のセキュリティ解除も行いました。
Microsoft .NET Framework は4.7です。
Microsoft Visual C++ 2010 Redistributable(x86) と
Microsoft Visual C++ 2010 Redistributable(x64)がインストールされております。
「ScriptMakerPS.fmx」は以前に製作していただいたものを使用しております。
なぜかこれ一台のみ設定ができない状態です。
(※急いではおりません。)
年末のお忙しい中恐れ入りますが、ご回答のほどよろしくお願い申し上げます。
いつもお世話になります。
よろしくお願いいたします。
環境
FM13AD WIN7 selenium クローム powershell
12月13日にウインドウズの自動更新がされた後、グーグルクロームの起動が正常にできなくなりました。
「chromdriver.exeは動作を停止しました」とエラーの表示がされてしまいます。
どの時点でエラーがでるのかを確認したので記載いたします。
1、起動(変数を設定の値の部分だけ記載します。)
SMPS_Exe(
"
Add-Type -Path 'C:\WebDriver\selenium\net40\WebDriver.dll' ;
Add-Type -Path 'C:\WebDriver\selenium\net40\WebDriver.Support.dll' ;
$chromedriver_path = 'C:\WebDriver\chromedriver_win32' ;
<#WebDriverのオプションを定義#>
$options = New-Object OpenQA.Selenium.Chrome.ChromeOptions;
<#--ignore-certificate-errorの出力を防止する#>
$options.addArgument('test-type');
<#機能拡張停止#>
$options.addArgument('--disable-extensions');
$chromeService = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($chromedriver_path);
$chromeService.HideCommandPromptWindow=$true;<#コマンドプロンプト非表示#>
$driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver ($chromeService,$options);
[OpenQA.Selenium.Support.UI.WebDriverWait]$wait = New-Object OpenQA.Selenium.Support.UI.WebDriverWait ($driver,[System.TimeSpan]::FromSeconds(10));
"
)
上記部分はおそらく正常に行われ、ブラウザが何もない状態で起動します。
2、ログイン
Let([
Script=
"
$driver.Navigate().GoToUrl({url})
"
;Script=Substitute ( Script ;
["{url}" ; Quote ("https://www.mercari.com/jp/login/?")] )
];
SMPS_Exe( Script )
)
Let([
Script=
"
$elements = $driver.FindElementsByName('email');
$elements[0].Click();
$elements[0].SendKeys( {account} );
$elements = $driver.FindElementsByName('password');
$elements[0].Click();
$elements[0].SendKeys( {password} );
"
;Script=Substitute ( Script ;
["{account}" ; Quote ( Account::account)]
;["{password}" ; Quote ( Account::password)] )
];
SMPS_Exe( Script )
)
上記を実行すると「chromdriver.exeは動作を停止しました」とエラーの表示がでます。
試しに、URL部分を
https://www.mercari.com/jp/login/? から
https://www.google.co.jp/?gws_rd=ssl に変更すると
エラーの表示がなくなりました。
ただ、他のサイトのログインURLを使用するとやはりエラーが出てきます。
更新の影響でしょうか?それもとクロームの仕様が変わったのでしょうか?
もし、変更箇所や更新などする必要があれば、ご教授いただけますと助かります。
大変お手数となりますが、ご回答のほどよろしくお願い申し上げます。
ありがとうございます。
ご提示いただいた
$elements = $driver.FindElements([OpenQA.Selenium.By]::xpath('//a[text()=\"オークションの早期終了\"]'));
$hack =$elements.LocationOnScreenOnceScrolledIntoView;
$Y=$hack[0].Y;
$driver.ExecuteScript(\"window.scrollTo(0, $Y);\");
$elements[0].Click();
上記のプログラムで無事にaタグをクリックすることができました。
ありがとうございます。
またいつも適切なまた間違いないご回答をいただきありがとうございます。
本当にFileMaker+ScriptMakerPS+powershellはすごいと思います。
可能性が無限大です。
今後もご指導のほどよろしくお願い申し上げます。
本当にありがとうございました。
お世話になります。
ご回答ありがとうございます。
詳しくご説明くださり、ありがとうございます。
参考のURLを確認しましたところ、問題は
「クリックしようとしている要素が表示されれいる領域に表示されていない」
ことが原因でした。
「FireFoxだとこの現象は発生しないのですが(あくまで私が見たケースではですが・・・)
Chromeだとよく発生します。」
との事です。
私なりに考えた解決策はTABキーを連打して「オークションの早期終了」が
表示される位置まで、移動してクリックするようにしました。
[System.Windows.Forms.SendKeys]::SendWait('{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}');
Start-Sleep -m 2000;
$elements = $driver.FindElements([OpenQA.Selenium.By]::xpath('//a[text()=\"オークションの早期終了\"]'));
$elements[0].Click();
この内容で動作しました。
ご回答いただきましたとおりのプログラムで動作しました。
正解のご回答を頂きありがとうございます。
ただ、参考URLでは下記の記載がございました。
Actions action = new Actions(driver);
WebElement btnElement = driver.findElement(By.id(("add")));
btnElement.click();
「1行目でスクロールに必要なorg.openqa.selenium.interactions.Actionsを生成し、」
とありますが、私の場合ですとどのような記述になりますでしょうか?
できれば、TABキーでなく、スマートな方法でクリックしたいと考えております。
大変お手数となりますが、ご回答のほどよろしくお願い申し上げます。
いつもお世話になります。
ご質問させてください。
よろしくお願いいたします。
環境
FM13AD WIN7 selenium クローム powershell
下記のソース部分で「オークションの早期終了」のaタグをクリックをしたいのです。
(※URL部分の一部を削除しております。)
<div class="Management">
<dl>
<dt class="Management__title">オークションの管理</dt>
<dd class="Management__body">
<ul>
<li class="Management__item">
<dl>
<dt class="Management__name">
<a href="https://auctions.yahoo.co.jp/jp/show/qanda?aID=" data-ylk="rsec:aucdata;slk:answ;pos:1" >出品者への質問</a>
(質問なし) </dt>
</dl>
</li>
<li class="Management__item"><a href="https://auctions.yahoo.co.jp/pageinfo9/jp/show/updateauction?aID" data-ylk="rsec:amng;slk:aedt;pos:1" >オークションの編集</a></li>
<li class="Management__item"><a href="https://auctions.yahoo.co.jp/jp/config/featured?aID" data-ylk="rsec:amng;slk:af;pos:1" >注目のオークション設定</a></li>
<li class="Management__item"><a href="https://auctions.yahoo.co.jp/jp/show/sthotauc_entry?aID" data-ylk="rsec:amng;slk:bha;pos:1" >ストアホットオークションの設定</a></li>
<li class="Management__item"><a href="https://page.auctions.yahoo.co.jp/jp/show/cancelauction?aID" data-ylk="rsec:amng;slk:acnc;pos:1" >オークションの取り消し</a></li>
<li class="Management__item"><a href="https://page.auctions.yahoo.co.jp/jp/show/closeauction?aID" data-ylk="rsec:amng;slk:ecls;pos:1" >オークションの早期終了</a></li>
<li class="Management__item"><a href="https://auctions.yahoo.co.jp/jp/show/cancelbid?aID=" data-ylk="rsec:amng;slk:bcnc;pos:1" >入札の取り消し</a></li>
<li class="Management__item"><a href="https://auctions.yahoo.co.jp/user/show/prefs?select=blacklist&.done=https://auctions.yahoo.co.jp/jp/show/amgr?aID=" data-ylk="rsec:amng;slk:bledt;pos:1" >ブラックリストの編集</a></li>
<li class="Management__item">
<dl>
<dt class="Management__name">ストア内商品検索キーワード</dt>
<dd class="Management__description"><span class="Management__bullet">:</span>
</dd>
</dl>
</li>
</ul>
</dd>
</dl>
</div><!-- /.Management -->
VBSで下記のプログラムでクリックができています。
今も稼動しています。
'■innnerText が "オークションの早期終了" のLinkタグ<a>をクリック。
Set element=ie.document.getElementsByTagName("a")
For Each obj In element
if obj.innerText="オークションの早期終了" Then
'MsgBox(obj.href)
obj.click()
Exit For
End If
Next
これをselenium+powershellで書き直して実行したいのですが、思うように書き換えができません。
グーグルクロームからXpathを取得しましたので記載します。
//*[@id='l-sub']/div[1]/ul/li[4]/div[3]/dl/dd/ul/li[6]/a または
#l-sub > div.ProductInformation > ul > li:nth-child(4) > div.Management > dl > dd > ul > li:nth-child(6) > a
です。
いくつか試してみたプログラムを記載いたします。
1、
$elements = $driver.FindElement([OpenQA.Selenium.By]::xpath('//a[text()=\"オークションの早期終了\"]'));
$elements[0].Click();
2、
$elements = $driver.FindElementsByTagName('a');
$elements = $elements.FindElement([OpenQA.Selenium.By]::xpath('//*[text()=\"オークションの早期終了\"]'));
$elements[0].Click();
3、
$elements = $driver.FindElement([OpenQA.Selenium.By]::xpath(\"//*[@id="l-sub"]/div[1]/ul/li[4]/div[3]/dl/dd/ul/li[6]/a[text()='オークションの早期終了']\"));
$elements[0].Click();
4、
$elements = $driver.FindElements([OpenQA.Selenium.By]::CssSelector('#l-sub > div.ProductInformation > ul > li:nth-child(4) > div.Management > dl > dd > ul > li:nth-child(6) > a'));
$elements[0].Click();
5、$elements = $driver.FindElementsByClassName('Management');
$elements = $elements.FindElementsByTagName('dl')[1];
$elements = $elements.FindElementsByTagName('dt')[1];
$elements = $elements.FindElementsByTagName('dd')[1];
$elements = $elements.FindElementsByTagName('ul')[1];
$elements = $elements.FindElementsByTagName('li')[6];
$elements = $elements.FindElementsByTagName('a')[1];
$elements[0].Click();
上記以外にも50通りほど考えてみたのですが、それでもクリックされませんでした。
私の力では及ばないようです。
大変お手数となりますが、ご教授のほどよろしくお願い申し上げます。
[ 0.010 秒でページを生成, 6 クエリーを実行 - 使用メモリー: 825.64 KiB (ピーク: 890.3 KiB) ]