FILEMAKER プラグイン など (助け合い)フォーラムにようこそ!
何方でも、ご質問・ご回答お願いします。
※2024/01/31 までに登録された方は、登録時のパスワードが使えません。
パスワードを再発行してください。
ページ: 1
いつもお世話になります。
ご質問させてください。
よろしくお願いいたします。
環境
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通りほど考えてみたのですが、それでもクリックされませんでした。
私の力では及ばないようです。
大変お手数となりますが、ご教授のほどよろしくお願い申し上げます。
オフライン
1、
$elements = $driver.FindElement([OpenQA.Selenium.By]::xpath('//a[text()=\"オークションの早期終了\"]'));
$elements[0].Click();
mamasさんが書いている上記で動作しますよ。
厳密に書くと FindElement → FindElements が良いですが、どちらでも動作します。
$elements = $driver.FindElements([OpenQA.Selenium.By]::xpath('//a[text()=\"オークションの早期終了\"]'));
$elements[0].Click();
以下の様な場合もあるようですが...
HTMLの構造によっては、 FindElements で、要素の取得が出来ないことがあるようです。
参考:
Selenium利用時のトラブルシューティング方法[クリック編] : https://javaworld.helpfulness.jp/post-254/
オフライン
お世話になります。
ご回答ありがとうございます。
詳しくご説明くださり、ありがとうございます。
参考の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キーでなく、スマートな方法でクリックしたいと考えております。
大変お手数となりますが、ご回答のほどよろしくお願い申し上げます。
オフライン
以下でスクロール出来ます。
$hack =$elements.LocationOnScreenOnceScrolledIntoView;
$Y=$hack[0].Y;
$driver.ExecuteScript("window.scrollTo(0, $Y);");続けて書くとこんな感じです。
$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();オフライン
ありがとうございます。
ご提示いただいた
$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はすごいと思います。
可能性が無限大です。
今後もご指導のほどよろしくお願い申し上げます。
本当にありがとうございました。
オフライン


以下のコードを試してみてください。PowerShellとSeleniumでXPathを使って「オークションの早期終了」のリンクをクリックする方法です。XPathでの検索を直接行うので、コードがシンプルかつ動作しやすいはずです。
powershell
# Selenium WebDriverのセットアップ(ChromeDriverを使用)
$driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver
# ターゲットのURLを開く
$driver.Navigate().GoToUrl("https://ターゲットのURL")
# オークションの早期終了リンクをXPathで見つけてクリック
try {
# XPathを使用して「オークションの早期終了」リンクを特定
$element = $driver.FindElement([OpenQA.Selenium.By]::XPath("//a[contains(text(),'オークションの早期終了')]"))
# 見つかった場合はクリック
$element.Click()
Write-Output "クリック成功しました。"
}
catch {
Write-Output "クリックに失敗しました: $($_.Exception.Message)"
}
# ブラウザを閉じる
$driver.Quit()
ポイント
XPath内でcontains(text(),'オークションの早期終了')を使うことで、テキストの一部一致でも確実に見つけることができます。
PowerShellでは、FindElementを使うことで最初に見つけた要素を一つだけ取得でき、リンクをクリックする際にClick()を簡単に実行できます。
カウンターストライクゲームのファン。私は cs2 ケース 入手 プラットフォームでケースを開けて武器に最適なスキンを入手するのが大好きです。
オフライン
ページ: 1
[ 0.010 秒でページを生成, 9 クエリーを実行 - 使用メモリー: 575.84 KiB (ピーク: 591.74 KiB) ]