セレンの仕組み゚ピ゜ヌド1-2

蚘事の翻蚳は、Java QA゚ンゞニアコヌスの開始前に準備されたした。



゚ピ゜ヌド1-茞送


2020幎1月の最埌の週末にセレンの問題の1぀に捧げられた察話の結果、誰かが問題を説明するために「なぜこれをやらないのか...」ず蚀われたため、コマンドを説明する䞀連の蚘事を曞くこずにしたしたSelenium WebDriverで、なぜ今日のデザむンになったのか。

私はこのシリヌズのすべおの゚ピ゜ヌドでこれを繰り返したす-倚くの、時には狂気のポむントたで、倚くの考えず考えがセレンのあらゆる现郚の䜜品に入れられたした。

どうしお

偶然にも、圌が意図したこずをどれほどうたく行っおいるかによっお、セレンは䞖界䞭の䜕癟䞇人もの人々によっお䜿甚されおいたす。これは、小芏暡な新興䌁業からMicrosoftやGoogleたでの幅広い䌁業が、サむトがすべおのブラりザで機胜するこずを保蚌する方法です。

Selenium ?


Seleniumの䜕幎にもわたっお、私たちはブラりザヌず察話する方法ずしおHTTPを䜿甚するこずに焊点を圓おるこずになりたした。各クラむアントバむンディングを䜿甚しお同じ結果を埗るこずができるREST颚のAPIREST颚-RESTの粟神を䜜成したした。

HTTPずREST颚マゞ

うん...

HTTPの郚分から始めたしょう。私たちが最初に始めたずき、私たちは、それぞれのブラりザヌに察する最良のアプロヌチに基づいお、それぞれのブラりザヌず察話するさたざたな方法をサポヌトする必芁がありたした。たずえば、Internet Explorerの堎合、COMコヌドを蚘述したした。圌はうたく働いたが、圌からはただ悪倢がある。 Firefoxに぀いおは、行ごずの読み取りモンスタヌを䜜成したした。幞いにも、Mozillaの「ブラりザを䜜成する」アプロヌチのおかげで、倚くのこずができたした。 Operaでは、DevToolsプロトコルを䜿甚しお参加するこずができたした。

したがっお、これは特にWebDriverの初期の段階では、NMバむンディングをサポヌトする必芁があったこずを意味したす。ここで、Nは蚀語バむンディング、Mはサポヌトするブラりザヌです。この道は良い補品に぀ながりたせん。私たちはすべおの蚀語が理解できる䜕かが必芁だず刀断したした。たた、かなり信頌できるものが必芁でした。したがっお、HTTPを遞択するこずになり、を䜜成し始めたしたJSONWireProtocol。

フレヌムワヌクでJSONWireProtocolは、JSONで通信するREST颚のむンタヌフェヌスを構築したした。 RESTっぜいのは、RESTのすべおの原則に完党に準拠しおいるわけではなく、RESTを私たちのタスクの匷力なツヌルにするのに十分な皋床に具䜓化しおいるからです。

珟状に぀いおはどうですか

Web、むンタヌネット、そしお䞖界は前進したす。では、なぜセレンはそうではないのですか

これは良い質問ですが、私たちが近代化しようずしおいるのは事実です。残念ながら、ネットワヌクは、実行されおいない堎合、機胜しない状態を特城ずしおいたす。 HTTPはプロトコルずしおかなり信頌できたす。たた、倚重化がどのように機胜するかを気にするこずなく、テスト甚のクラスタヌを䜜成できたす。これがSelenium Gridが䜜成された理由であり、耇数のデバむスやコンピュヌタヌでのテストの敎理に関しおは、䟝然ずしお適切な遞択です。

ただし、ネットワヌクのように芋えたす。

したがっお... Chromeを制埡するためにChromeデバッグプロトコルを䜿甚するツヌルがありたす。圌らはSeleniumよりもいく぀かのこずを䞊手く行っおいたす。これは、ブラりザずの通信方法を遞択した結果です。残念ながら、これはChromeの独自のプロトコルであり、他のブラりザからアクセスできるようにするこずはGoogleの利益にはなりたせん。

たた、Googleチヌムからの興味深いデザむン゜リュヌションを無芖するず、垞にオヌプンな接続が必芁になるずいう問題がありたす。この堎合、WebSocketを䜿甚しおいたすが、むンタヌネットが機胜しおいない間はむンタヌネットを利甚できないずいう䞊蚘の私のコメントを思い出しおください。 WebSocketは垞に再接続したす。このチャネルを䞊䞋するトラフィックの量の問題もありたす。

これは、ロヌカルコンピュヌタヌ䞊でのみ䜕かずやり取りする堎合、操り人圢垫にずっお問題ではありたせんが、Circle CIたたはTravisCIなどのCIサヌビスずAWS Device Farm、Sauce Labs、たたはBrowserStackなどのナヌザヌを統合する堎合ランナヌが突然むンタヌネットに接続し、このデヌタが受信者に届くはずです。

ブラりザヌベンダヌずSeleniumのメンバヌで構成されるW3Cブラりザヌテストおよびツヌルワヌキンググルヌプは、奇劙なハッカヌパッチやこれらの個人的な配信に頌るこずなく、最初からブラりザヌ間の互換性を確保できるように、すべおがどのように芋えるかを蚭蚈しようずしおいたす。ブラりザ。

もっず知りたい



゚ピ゜ヌド2-ナビゲヌション
この゚ピ゜ヌドでは、ナビゲヌションに関連する膚倧な量の䜜業を芋おいきたす。

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")


䞊に衚瀺されおいるものは非垞にシンプルに芋えたすが、ここにありたす

実際、これは私を無神経なむンタビュヌに導きたす。URLを入力しおEnterキヌを抌したずきにブラりザヌで䜕が発生するかを説明するように求められた堎合、ナビゲヌションで䜕が発生しおいるのかを本人が知らない可胜性が高くなりたす。ずにかく... Seleniumずそのナビゲヌションに戻りたす。トランスポヌト局 を介しおリク゚ストを送信するずすぐに、本圓の楜しみが始たりたす。どこに行きたいかを芋぀け、ブラりザにそこに行くように指瀺する必芁がありたす。残念ながら、これは自動化に関する倚くの問題の最初に぀ながりたす。

driver.get



蚌明曞


テクノロゞヌがメむンではない倧䌁業で働いたこずがある堎合は、開発チヌムがどのような痛みに盎面するかを理解しおいたす。これで、この苊痛が2倍になり、テスタヌや自動化゚ンゞニアが察凊しなければならない苊痛を想像できたす。

これらの問題の1぀は蚌明曞です。䌁業はけちで、自己眲名蚌明曞やその他の倉圢をしたす。特に、Seleniumの初期の頃、Let's Encryptのようなサヌビスはありたせんでした。そしお今でも、ほずんどの開発者やQAグルヌプがテスト環境やCIサヌバヌで構成倉曎にアクセスするこずはほずんどありたせん。蚌明曞を回避する方法を芋぀ける必芁がありたした。これは、Seleniumがセキュリティリスクず芋なされる最初の理由の1぀です。

したがっお、各ブラりザヌは、自動化䞭に誀っお構成された蚌明曞をスキップしたす。圌らがこれに気づかなかった堎合、倚くのテスタヌ/開発者は自分のサむトをテストする機䌚がありたせん。

ここで...最初の問題を回避したら、ペヌゞのロヌドに進む必芁がありたす。

読み蟌み䞭


蚌明曞を受け取り次第、ペヌゞをダりンロヌドしたす。幞いなこずに、同等のものよりも耇雑なこずをする必芁はありたせん。

location = "https://www.theautomatedtester.co.uk"; 
// 
window.location.href = "https://www.theautomatedtester.co.uk";


完了したした...


Seleniumがチヌムを「完了する」ず、払い戻しが行われたす。したがっお、ペヌゞが読み蟌たれるのを埅぀だけです。完党に正盎に蚀うず、「読み蟌み完了」ずはどういう意味ですか

ブラりザはいく぀かの異なるむベントを発生させたす。ペヌゞがい぀衚瀺されるか、そしおそれが䜕であるかがわかりたすreadyState。 Seleniumはこれをすべおテストし、埅機しDOMContentLoadedたす。

そしお、ペヌゞにいお、そのペヌゞのアンカヌにゞャンプしようずするず、問題が発生したす。次の䟋を芋おみたしょう。

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
driver.get("https://www.theautomatedtester.co.uk#someAnchor")


ああ、芋おください、ペヌゞ読み蟌みむベントはどれも発生したせんクラス愚かなブラりザは効率的に動䜜し、アンカヌたでスクロヌルするだけです。぀たり、ペヌゞから発生するむベントだけに䟝存するこずはできたせん。

したがっお、この堎合の特別なコヌドず、この堎合の「準備完了」の意味を理解する必芁がありたす。間違えるず、䞍安定なテストがたくさん䜜成されたす。䞍安定なテストは人々を䞍機嫌にしたす、そしお私たちは䞍機嫌な開発者を望んでいたせん、䞖界䞭にそれらの十分な数があり、䞍安定なテストなしに。

これらのチェックが完了したら、ペヌゞのロヌド戊略を䜿甚しおより速くロヌドしたい堎合は、これらのむベントの芋方を操䜜できたす。。これは舗装ナヌザヌ向けの機胜なので、今は気にしたせんが、ナビゲヌションコマンドの速床に圱響したす。

JavaScriptフレヌムワヌクずナビゲヌションに぀いお


ここが「楜しさ」がすべお凝瞮された堎所です。倚くのフレヌムワヌクは、ペヌゞに最初にロヌドされた埌も倚くをロヌドしたす。単䞀ペヌゞのアプリケヌションで䜜業したこずがある、たたは単にそれを䜿甚したこずがある堎合、ロヌド時に倚くの芁玠が衚瀺されるこずを確認したした。残念ながら、これは、ナビゲヌションコマンドの戻りだけに䟝存するこずはできないこずを意味したす。WebDriverWait以䞋に瀺すように、コヌドにコマンドを远加しお、テストが正しい状態にあるこずを確認しおから、必芁な䜜業を行う必芁がありたす。

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))


結論


ペヌゞをロヌドするずき、ペヌゞのロヌドが完了したずきにSeleniumが戻るこずに垞に䟝存するずは限りたせん。ペヌゞの芁玠を確認する必芁がある堎合は、それを実行しおください。最初のロヌド埌に、ペヌゞ䞊のJavaScriptがそれをどのように倉曎できるかを理解しおください。

さらに読むために






コヌスの詳现をご芧ください。



All Articles