SeleniumeBasicでその他Javascript使用例 usage_other

リファレンス

 Javascriptの構文のその他例です。構文のメイン内容がほぼJavaScriptの構文で占められていますので、SeleniumBasicの基本構文はあまり出てきません。

  • 利用目的は業務効率化です。(テスト自動化ではありません)
  • ブラウザはGoogleChromeが対象です。(EdgeやFirefoxは対象外)
  • 原文のVBAでは現在エラー発生する場合が多いため、修正を加えてます。
Examples.xlsmの保存場所(ここをクリック)

 Examples.xlsmが保存されている場所は、SeleniumBasicがインストールされているサブフォルダ内になります。SeleniumBasicのインストール完了時に保存フォルダを確認することができます。ただ、大体以下フォルダのどちらかにファイル保存されています。

  • C:\Program Files\Seleniumbasic\Examples\Excel
  • shell:Local AppData\SeleniumBasic\Examples\Excel
目次

反応速度の計測

 ホームページの取得に掛かる時間をミリ秒で出力する構文になります。JavaScriptでホームページ取得時間の各プロパティを取得しています。
 秒数は2つ出力され、最初は、ブラウザがURLを探し始める直前の時間(navigationStart)とブラウザがレスポンスを全て受け取った直後の時間(responseEnd)の差時間を出力します。
 次に、ブラウザがレスポンスを全て受け取った直後の時間(responseEnd)とWindowのloadイベント発火直後の時間(loadEventEnd)の差時間を出力します。
 各プロパティに関する説明は、以下ページを参照しました。

 では、SleniumBasicの構文を紹介します。

Private Sub Get_Performance_Timing()
    Const JS_GET_TIMINGS As String = _
        "var t=performance.timing; return [  " & _
        " t.responseEnd - t.navigationStart, " & _
        " t.loadEventEnd - t.responseEnd ];  "
    Dim Driver As New ChromeDriver
    Driver.Get "https://en.wikipedia.org/wiki/Main_Page"
    times = Driver.ExecuteScript(JS_GET_TIMINGS).values
    Debug.Print "Timing:"
    For Each T In times
        Debug.Print T
    Next T
    Driver.Quit
End Sub

2~5行目:JavaScript構文の設定
7行目:ウィキペディアのホームページを取得
8行目:JavaScript構文の実行
9~12行目:JavaScript構文で取得したミリ秒をイミディエイトウィンドウに出力

JavaScript構文も以下に紹介します。

var t=performance.timing; 
return [ t.responseEnd - t.navigationStart,  t.loadEventEnd - t.responseEnd ]; 

ホームページ内全要素のXPath取得

 SeleniumBasicでGetしたホームページ内の全要素をCSSで取得した後、JavaScriptで取得した要素のXPathをイミディエイトウィンドウに出力する構文となります。元文ではJavaScript実行時にエラーが発生してしまいましたので、以下ページからJavaScript構文を参照しています。

Private Sub Build_XPath_Locators()        
Const JS_BUILD_XPATH As String = _
    "var e=this,p=[];for(;e&&e.nodeType==1;e=e.parentNode){if(e.id){p.unshift('*[@id" & _
    "=\''+e.id+'\']');break;}var i=1,u=1,t=e.localName,c=e.className;for(var s=e.pre" & _
    "viousSibling;s;s=s.previousSibling){if(s.nodeType!=10&&s.nodeName==e.nodeName){" & _
    "if(c==s.className)c=null;u=0;++i;}}for(var s=e.nextSibling;s;s=s.nextSibling){i" & _
    "f(s.nodeName==e.nodeName){if(c==s.className)c=null;u=0;}}p.unshift(u?t:(t+(c?'[" & _
    "@class=\''+c+'\']':'['+i+']')));}return '//'+p.join('/');"
    
    Dim Driver As New ChromeDriver
    Driver.Get "https://ja.wikipedia.org/wiki/メインページ"
    Dim elements As WebElements
    Set elements = Driver.FindElementsByCss("*")
    Dim list_xpath
    Set list_xpath = elements.ExecuteScript(JS_BUILD_XPATH)
    For Each txt In list_xpath
        Debug.Print txt
    Next txt
    
    Set elements = Nothing
    Set list_xpath = Nothing
    Driver.Quit
End Sub

2~8行目:JavaScript構文の設定
11行目:ウィキペディアのホームページを取得
12,13行目:FindElementsByCss("*")でホームページ内の全CSS要素を取得
14、15行目:JavaScript構文の実行
16~18行目:JavaScript構文で取得したXPathをイミディエイトウィンドウに出力
20、21行目:要素の破棄(ここで要素の破棄を明示しないと、2回目実行時にエラー発生)

JavaScript構文を整理して掲載しておきます。

var e=this,p=[];
for(;e&&e.nodeType==1;e=e.parentNode){
    if(e.id){
        p.unshift('*[@id=\''+e.id+'\']');
        break;
    }
    var i=1,u=1,t=e.localName,c=e.className;
    for(var s=e.previousSibling;s;s=s.previousSibling){
        if(s.nodeType!=10&&s.nodeName==e.nodeName){
            if(c==s.className)c=null;u=0;++i;
        }
    }
    for(var s=e.nextSibling;s;s=s.nextSibling){
        if(s.nodeName==e.nodeName){
            if(c==s.className)c=null;u=0;
        }
    }
    p.unshift(u?t:(t+(c?'[@class=\''+c+'\']':'['+i+']')));
}
return '//'+p.join('/');

ホームページ内全要素のCSS取得

 XPathに続いて、ホームページ内全要素のCSSの取得についての構文紹介です。

Private Sub Build_CSS_Locators()
Const JS_BUILD_CSS As String = _
    "var e=this,p=[],h=function(a,s){if(!a||!s)return 0;for(var i=0,l=a.length;i<l;i" & _
    "++){if(s.indexOf(a[i])==-1)return 0};return 1;};for(;e&&e.nodeType==1&&e.nodeNa" & _
    "me!='HTML';e=e.parentNode){if(e.id){p.unshift('#'+e.id);break;}var i=1,u=1,t=e." & _
    "localName,c=e.className&&e.className.split(/[\s,]+/g);for(var s=e.previousSibli" & _
    "ng;s;s=s.previousSibling){if(s.nodeType!=10&&s.nodeName==e.nodeName){if(h(c,s.c" & _
    "lassName))c=null;u=0;++i;}}for(var s=e.nextSibling;s;s=s.nextSibling){if(s.node" & _
    "Name==e.nodeName){if(h(c,s.className))c=null;u=0;}}p.unshift(u?t:(t+(c?'.'+c.jo" & _
    "in('.'):':nth-child('+i+')')));}return p.join(' > ');"

    Dim Driver As New ChromeDriver
    Driver.Get "https://ja.wikipedia.org/wiki/メインページ"
    Dim elements As WebElements
    Set elements = Driver.FindElementsByCss("*")
    Dim list_css
    Set list_css = elements.ExecuteScript(JS_BUILD_CSS)
    For Each txt In list_css
        Debug.Print txt
    Next txt
    
    Set elements = Nothing
    Set list_xpath = Nothing
    Driver.Quit

End Sub

2~10行目:JavaScript構文の設定
13行目:ウィキペディアのホームページを取得
14,15行目:FindElementsByCss("*")でホームページ内の全CSS要素を取得
16、17行目:JavaScript構文の実行
18~20行目:JavaScript構文で取得したCSSをイミディエイトウィンドウに出力
22、23行目:要素の破棄(ここで要素の破棄を明示しないと、2回目実行時にエラー発生)

JavaScript構文を整理して掲載しておきます。

var 
    e=this,
    p=[],
    h=function(a,s){
        if(!a||!s)return 0;
        for(var i=0,l=a.length;i<l;i++){if(s.indexOf(a[i])==-1)return 0};
        return 1;
    }
;
for(;e&&e.nodeType==1&&e.nodeName!='HTML';e=e.parentNode){
    if(e.id){p.unshift('#'+e.id);break;}
    var i=1,u=1,t=e.localName,c=e.className&&e.className.split(/[\s,]+/g);
    for(var s=e.previousSibling;s;s=s.previousSibling){
        if(s.nodeType!=10&&s.nodeName==e.nodeName){if(h(c,s.className))c=null;u=0;++i;}
    }
    for(var s=e.nextSibling;s;s=s.nextSibling){
        if(s.nodeName==e.nodeName){if(h(c,s.className))c=null;u=0;}
    }
    p.unshift(u?t:(t+(c?'.'+c.join('.'):':nth-child('+i+')')));
}
return p.join(' > ');

リンクテキスト検索によるCSS取得(要素は一つ)

 前段は、ホームページ内全要素のCSSを取得しましたが、今回は、リンクテキストを検索し、ヒットした要素一つのCSSをイミディエイトウィンドウに出力します。JavaScript構文内容は前段の構文と同一です。

Private Sub Build_CSS_Locators2()
Const JS_BUILD_CSS As String = _
    "var e=this,p=[],h=function(a,s){if(!a||!s)return 0;for(var i=0,l=a.length;i<l;i" & _
    "++){if(s.indexOf(a[i])==-1)return 0};return 1;};for(;e&&e.nodeType==1&&e.nodeNa" & _
    "me!='HTML';e=e.parentNode){if(e.id){p.unshift('#'+e.id);break;}var i=1,u=1,t=e." & _
    "localName,c=e.className&&e.className.split(/[\s,]+/g);for(var s=e.previousSibli" & _
    "ng;s;s=s.previousSibling){if(s.nodeType!=10&&s.nodeName==e.nodeName){if(h(c,s.c" & _
    "lassName))c=null;u=0;++i;}}for(var s=e.nextSibling;s;s=s.nextSibling){if(s.node" & _
    "Name==e.nodeName){if(h(c,s.className))c=null;u=0;}}p.unshift(u?t:(t+(c?'.'+c.jo" & _
    "in('.'):':nth-child('+i+')')));}return p.join(' > ');"
  
    Dim Driver As New ChromeDriver
    Driver.Get "https://ja.wikipedia.org/wiki/メインページ"
    Dim css As String
    css = Driver.FindElementByLinkText("ウィキペディア").ExecuteScript(JS_BUILD_CSS)
    Debug.Print css
    Driver.Quit
End Sub

2~10行目:JavaScript構文の設定
13行目:ウィキペディアのホームページを取得
14,15行目:リンクテキスト("ウィキペディア")を検索し、取得した要素をJavaScript構文でCSS取得
16行目:JavaScript構文で取得したCSSをイミディエイトウィンドウに出力

属性ノードの取得

 FindElementでキャッチした要素について、属性ノードを取得し、イミディエイトウィンドウに出力する構文を紹介します。

Private Sub List_Element_Attributes()
Const JS_LIST_ATTRIBUTES As String = _
    "var d={}, a=this.attributes;  " & _
    "for(var i=0; i<a.length; i++) " & _
    "  d[a[i].name]=a[i].value;    " & _
    "return d;"
  
    Dim Driver As New ChromeDriver
    Driver.Get "https://ja.wikipedia.org/wiki/メインページ"
    Dim element As WebElement
    Set element = Driver.FindElementById("mw-content-text")
    Dim atts: Set atts = element.ExecuteScript(JS_LIST_ATTRIBUTES)
    For Each att In atts
        Debug.Print att.Key & "  " & att.Value
    Next att
    Driver.Quit
End Sub

2~6行目:JavaScript構文の設定
9行目:ウィキペディアのホームページを取得
10,11行目:Idを検索し、Web要素を取得
12行目:JavaScript構文で属性ノード取得
13~15行目:JavaScript構文で取得した属性ノードをイミディエイトウィンドウに出力

今回イミディエイトウィンドウに出力された属性ノードは以下のとおりです。

class mw-body-content mw-content-ltr
dir ltr
id mw-content-text
lang ja

これを実際のChromeのディベロッパーツールでも確認してみました。

イミディエイトウィンドウに出力された属性ノードが実際のChromeでも確認できました。

JavaScript構文を整理して掲載しておきます。

var 
d={}, 
a=this.attributes;  
for(var i=0; i<a.length; i++)d[a[i].name]=a[i].value;    
return d;
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

VBAを中心とした自動化、効率化の手法を紹介しています。現在は、SeleniumBasicのexamplesを紹介しています。その内、SeleniumBasic以外の手法も掲載したいと思っております。

目次