English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

python+seleniumでログイン後の自動クリックを実現する例

会社ではコードレビューの際にコードを見る時間を制限していますが、実際には多くのコードがフレームワークによって自動生成されており、多くの時間をコードを見る必要はありません。この基準を満たすために、一定の時間をブラッシュアップする必要があります(ウェブページの固定領域をマウスクリック)。私はこのような無駄な体力労働を自動化テストの手段を利用して完了できると考えました。

まず、要件を明確にします:   

  1. 自動的にウェブページを開きます   
  2. ログインするアカウント 
  3. 一定の間隔で固定領域をクリックします

私が思いつく方法は二つです、sikuliまたはpython+selenium。sikuliの利点は、論理操作が単純で直接行えること、画像を使用したマークとしての利点がありますが、ウィンドウが固定され、バックグラウンドで実行できないという欠点があります。seleniumは少し複雑ですが、高速で実行され、ウィンドウを隠すことができます。

ここではPythonを使用してseleniumの使用方法を簡単に記録します。+seleniumの小さな例です。

使用するPythonのバージョンが3.3およびselenium2Windows環境(現在はサポートされています)3.0以上になっていますが、多くのフォーラムやブログでは更新されていません)。

まずはソフトウェアのインストールについて説明します。Pythonについては特に触れませんが、環境変数の設定を忘れないでください。

以下にseleniumのインストールを行います。pipが既にインストールされている場合、以下のコマンドを実行します。

pip install -U selenium

もう一つの方法は、https://pypi.python.org/packages/source/s/selenium/selenium-2.52.0.tar.gzダウンロードして解凍してください。ここではWindowsバージョンについて簡単に説明しますが、Unixでも大差ありません。Wgetを使用してインストールします。

使用命令(setup一般用于第三方模块的安装):

コマンドを使用して(setupは通常、サードパーティーモジュールのインストールに使用されます):3cd c:\Python
\xxxx

python setup.py install

インストールプロセス中にImportError: No module named setuptoolsが発生することがあります。これはsetuptoolsモジュールが欠けているため、Pythonのデフォルトではインストールされていないためです。http://pypi.python.org/pypi/setuptools上記には各システムのインストールパッケージとインストールガイドが提供されています。Windowsシステムの場合、以下をダウンロードしてください:https://bootstrap.pypa.io/ez_setup.py自動インストールスクリプト。

実行:

python ez_setup.py

それから、Seleniumをインストールします。

ここでは、私の実際の例を使用してプロセスを簡単に説明します。

最初にブラウザを開くことを完了します。

selenium2Seleniumとwebdriverを組み合わせて、各ブラウザの対応するドライバーを直接インポートし、開くだけで済みます。ただし、Chromeドライバーは別途インストールする必要がある場合があります。

from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://www.xxx.com')

ウェブページを開いた後、ログインが必要です、F12ブラウザのデバッグツールを開き、小さな矢印で要素を選択し、ログインボックスのアカウントとパスワードの属性を確認します。一般的にはIDがあります。Seleniumは以下の各方法を使用して要素を取得し、さまざまな操作を行うことができます。詳細は上記リンクドキュメントを参照してください:

  1. find_element_by_id
  2. find_element_by_name
  3. find_element_by_xpath
  4. find_element_by_link_text
  5. find_element_by_partial_link_text
  6. find_element_by_tag_name
  7. find_element_by_class_name
  8. find_element_by_css_selector

その中でidが最も有効で便利であり、優先的に考慮します。要素を選択した後、WebDriver APIを通じてキーボードの入力やマウスのクリック操作をシミュレートできます。以下のようになります:

username="qun" 
passwd="passwd"
browser = webdriver.Firefox()
browser.get('https://www.xxx.com')
browser.implicitly_wait(10)
elem=browser.find_element_by_id("loginFormUserName")
elem.send_keys(username)
elem=browser.find_element_by_id("loginFormPassword")
elem.send_keys(passwd)
elem=browser.find_element_by_id("loginFormSubmit")
elem.click()

一般的にログイン後、ページが新しいページにジャンプします。新しいページをどうやって取得しますか?ここにウィンドウハンドルの概念があります。ウィンドウハンドルを切り替えて実行します。注意!要素がフレーム内にある場合、swtichを使用する必要もあります。ここにwait関数(上にもあります)が使用されているのは、ページの読み込みに時間がかかるためです。クリック後に要素が読み込まれることが多いので、次のセクションで詳細に説明します。

browser.implicitly_wait(10)
browser.switch_to_window(browser.window_handles[-1]

次にクリックする必要のあるエリアを選択します。ここではxpathを使用しています。なぜなら、自動化テストの過程で、要素がidやnameなどの方法で定位できないことが多いからです(多くの人がidやnameを書かない場合もあり、tableをtableに重ね合わせることが好きです。私もそうですが、どうすることもできません)。xpathがその役割を果たします。一般的な手短な方法として、Firefoxにxpathプラグインをインストールして、右クリックで直接取得することができます。ここでは説明しません。なぜなら、それを推奨しないからです。プラグインを使用すると、コードにこのようなものが溢れかえることがあります:   

XPath(/html/body/div/div[3]/div[2]/div[4]/p[2])

可能な限り、要素の特徴を利用して定位を行いましょう。例えば、ボタンのnameを使用します。

または親要素を通じて子要素を定位します。

username =browser.find_element_by_xpath("//input[@name='username']")
clear_button = browser.find_element_by_xpath("//form[@id='loginForm']/input[4]")

以下のコードは、よく見られるByの使用法を示していますが、パッケージをインポートする必要があります。

from selenium.webdriver.common.by import By

ここでは別の関数を使用していますが、違いが何かはわかりません- -。

for i in range(100):
  elem=WebDriverWait(browser, 30).until(
    lambda x:x.find_element_by_xpath("//table[@class='aaa']"/td[1))
  elem.click()
  time.sleep(20)
  print ("click",i)

さらに、wait関数についても触れたいと思います。selenium2待機時間には、明示的な待機とインプルティット待機の二種類があります。  

表示待機

明示的な待機は、特定の要素が表示されるか、要素がクリック可能などの条件を待つことで、待ち続けることを意味します。待ち続けるときに、指定された時間内に要素が見つからない場合、例外がスローされます。

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement"))
  )

インプルティットウェイト

注意してください。イン implcit waitは、全てのDOM要素が特定の要素を探しているときに、すぐに見つからない場合に、この期間を試みることを示しています。

browser.implicitly_wait(10) # seconds

両者の違いは、一つが自分でタイムアウトオブジェクトを管理し、もう一つがwebdriverに任せていることです。

もちろん、待機する方法で待つこともできます。timeパッケージをインポートすることを忘れないでください。

time.sleep(20)

ここでは使い方を簡単にデモンストレーションしましたが、改善できる点がたくさんあります。関数を封装せず、マルチスレッドで複数の例を同時に実行するようにしていません。今後の要望に応じて改善します。

これでこの記事はすべて終わります。皆様の学習に役立つことを願っています。また、ナイアラチュートリアルのサポートをたくさんお願いします。

声明:この記事の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、アップロードしたものであり、このサイトは所有権を有しておらず、人工的に編集されていないため、法的責任を負いません。著作権侵害の可能性がある内容が見つかった場合は、notice#wまでメールを送ってください。3codebox.com(メール送信時、#を@に置き換えてください。申し訳ありませんが、証拠を提供していただき、侵害が確認された場合、このサイトは即座に侵害されたコンテンツを削除します。)

基本教程
おすすめ