Web 自動テスト ツールである Selenium の使用

セレン

概要

Selenium は、ブラウザ操作を自動化するためのオープンソース フレームワークです。Web アプリケーションの機能とユーザー インターフェイスをテストするためのツールとライブラリのセットを提供します。

Selenium を使用すると、クリック、フォームへの入力、ドロップダウン ボックスの選択など、ブラウザーでのユーザー操作をシミュレートするスクリプトを作成できます。これらのスクリプトは自動的に実行され、アプリケーションが期待どおりに動作することを確認できます。

Selenium は、Java、Python、C# などのさまざまなプログラミング言語をサポートしているため、開発者は使い慣れた言語でテスト スクリプトを作成して実行できます。

Selenium には、ブラウザーと直接対話するための Selenium WebDriver、複数のブラウザーやプラットフォーム間でテストを並行して実行するための Selenium Grid など、さまざまなツールやコンポーネントもあり、閲覧検索、対話、ページ要素のアサーションを処理するための豊富な API と機能を提供します。

公式ウェブサイト:https://www.selenium.dev/

公式ウェブサイトのドキュメント:https://www.selenium.dev/documentation/

中国語のドキュメント:https://python-selenium-zh.readthedocs.io/zh_CN/latest/

ここに画像の説明を挿入します

動作原理

ブラウザのネイティブ API を利用し、それをオブジェクト指向の Selenium WebDriver API (ブラウザのさまざまな機能をカプセル化します) にカプセル化します。プログラム スクリプトは、Selenium API を通じてブラウザ (Google および Microsoft) を制御し、ブラウザのページ要素を操作したり、ブラウザ自体 (スクリーンショット、ウィンドウ サイズ、起動、シャットダウン)

アプリケーションシナリオ

自動テスト:

Selenium は、最も一般的に使用される自動テスト ツールの 1 つです。実際のユーザーの対話動作をシミュレートし、機能テスト、回帰テスト、パフォーマンス テストなどのさまざまなテスト ケースを自動的に実行できます。Selenium を使用すると、Web アプリケーションのさまざまな機能を自動的にテストし、ユーザー インターフェイスの正確性を検証し、問題をキャプチャして報告することができます。

互換性テスト:

Selenium を使用すると、自動テスト スクリプトをさまざまなブラウザやオペレーティング システムで実行して、さまざまな環境における Web アプリケーションの互換性を検証できます。これにより、アプリケーションがブラウザーやプラットフォーム間で一貫して実行されることが保証されます。

データスクレイピングとWeb要約:

Selenium を使用すると、Web コンテンツをクロールして必要なデータを取得できます。スクリプトを記述することで、ユーザーがブラウザを操作し、Web ページにアクセスし、価格比較やニュース概要などのデータを抽出する様子をシミュレートできます。

自動フォーム入力:

大量のフォーム データを入力する必要がある場合、手動で入力すると多大な時間と労力がかかる可能性があります。Selenium を使用すると、フォームに自動的に入力して効率を向上させるスクリプトを作成できます。

UI自動テスト:

Selenium は、ユーザー インターフェイスの正確さと一貫性を検証できます。ユーザーの対話と操作をシミュレートすることにより、ユーザー インターフェイスのさまざまなシナリオを自動的にテストして、その正確さと機能性を確認できます。

フロントエンドの開発とデバッグ:

開発者は Selenium を使用してフロントエンド コードをデバッグおよび検証できます。自動テスト スクリプトを使用すると、ユーザーのアクションをシミュレートし、ページのレンダリングと機能が適切に動作するかどうかを確認できます。

ブラウザドライバをインストールする

Chrome ブラウザを例として、ブラウザ ドライバをインストールします。

知らせ:必须下载对应的 chrome 版本对应的驱动

クロムドライバー:https://sites.google.com/chromium.org/driver/

クロムドライバー (古い):https://sites.google.com/a/chromium.org/chromedriver/

国内タオバオミラー:http://npm.taobao.org/mirrors/chromedriver/

1. Chromeのバージョンを確認する

Chrome のバージョンを次のように決定します。110.0.5481.100
ここに画像の説明を挿入します
2. ChromeDriver のバージョンを決定します。

1. Chrome のバージョン番号を取得し、最後の部分を削除して、 を取得します110.0.5481

2. 結果をhttps://chromedriver.storage.googleapis.com/LATEST_RELEASE_背面につなぎ合わせます。

3. URL: を取得しhttps://chromedriver.storage.googleapis.com/LATEST_RELEASE_110.0.5481、リンクにアクセスして ChromeDriver のバージョン番号を取得します。

ここに画像の説明を挿入します
3.ChromeDriverをダウンロードする

対応するバージョンの ChromeDriver を見つけてダウンロードするだけで、最新の Chrome ブラウザなので、ホームページ上ですぐに見つけることができます。

ここに画像の説明を挿入します
オペレーティング システムに応じて異なる ChromeDrivers をダウンロードします。
ここに画像の説明を挿入します
3. 環境変数を構成します (オプション)

圧縮パッケージを解凍すると、実行可能ファイルが得られchromedriver.exe、Python コードを直接呼び出すことができます。

パス環境変数に、chromedriver.exe それが配置されているディレクトリを追加します。

基本的な使い方

Seleniumモジュールをインストールする

pip install selenium

注意点

バージョンの反復により、新しいバージョンの Selenium ではfind_element_by_idメソッドが使用されなくなり、 が使用されますfind_element(By.ID, '')。詳細については、Selenium のバージョンを参照してください。

バージョンの反復により、例外が発生する可能性があります。AttributeError: 'WebDriver' object has no attribute 'find_element_by_id'

from selenium import webdriver
from selenium.webdriver.common.by import By

# 老版本
input_element = browser.find_element_by_id("kw")

# 新版本
input_element = browser.find_element(By.ID, 'kw')

分析を使用する

Baidu を使用すると、seleniumキーワードが自動的に検索され、自動的にクリックされて検索結果にジャンプします。

入力ボックス要素の取得と検索ボタン要素情報の取得

ここに画像の説明を挿入します
最初の検索結果の住所情報を取得する
ここに画像の説明を挿入します

コード

# 导入模块
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

# 创建浏览器对象,需指定驱动。驱动有2种方式获取
# 1.通过手动指定浏览器驱动路径
browser = webdriver.Chrome('D:\Development\chromedriver_win32\chromedriver.exe')
# 2.通过$PATH环境变量寻找驱动,如果寻找不到就报错
# browser = webdriver.Chrome()

# 指定操作浏览器对象的行为
# 让浏览器访问网页
browser.get("https://www.baidu.com/")
# 获取输入框元素
# input_element = browser.find_element_by_id("kw")
input_element = browser.find_element(By.ID, 'kw')
# 输入内容
input_element.send_keys('selenium')
# 获取搜索按钮
button_element = browser.find_element(By.ID, 'su')
# 点击搜索
button_element.click()

time.sleep(3)

# 获取地址
url_element = browser.find_element(By.CLASS_NAME, "c-gap-bottom-small").find_element(By.TAG_NAME, 'a')
url_element.click()

time.sleep(5)

# 退出浏览器
browser.quit()

一般的な方法

ドライバーオブジェクト

Selenium を使用するプロセスでは、ドライバー オブジェクトをインスタンス化した後、ドライバー オブジェクトには一般的に使用されるいくつかのプロパティとメソッドが含まれます。

driver.page_source 当前标签页浏览器渲染之后的网页源代码
driver.current_url 当前标签页的url
driver.close() 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
driver.quit() 关闭浏览器
driver.forward() 页面前进
driver.back() 页面后退
driver.screen_shot(img_name) 页面截图

ラベル要素の検索とラベル オブジェクトの取得

Selenium でタグを見つけてタグ要素オブジェクトを返す方法はたくさんあります。

古いバージョン

find_element_by_xxx 返回第一个符合条件

find_elements_by_xxx 返回符合条件所有元素的WebEelemnt列表

find_element匹配不到就抛出异常,find_elements匹配不到就返回空列表
find_element_by_id 通过ID
find_element_by_class_name 通过class查询元素
find_element_by_name 通过name
find_element_by_tag_name 通过标签名称
find_element_by_css_selector css样式选择
find_element_by_link_text 通过链接内容查找
find_element_by_partial_link_text 通过链接内容包含的内容查找,模糊查询
find_element_by_xpath 通过xpath查找数据

新しいバージョン

find_element(BY, 'str')

find_elements(BY, 'str')
find_element(By.ID, 'id')
find_element(By.CLASS_NAME, 'calss_name')
find_element(By.NAME, 'name')
find_element(By.TAG_NAME, 'tag_name')
find_element(By.CSS_SELECTOR, 'css_selector')
find_element(By.LINK_TEXT, 'link_text')
find_element(By.PARTIAL_LINK_TEXT, 'partial_link_text')
find_element(By.XPATH, 'xpath')

テキストの内容と属性値を取得する

要素の属性値を取得する

element.get_attribute('属性名')

要素テキストの内容を取得する

element.text

入力ボックスにデータを入力します

input_element.send_keys('selenium')

要素をクリックする

button_element.click()

ヘッドレスブラウザを使用する

大多数のサーバーにはインターフェースがありません。Selenium はヘッドレス モードで Google Chrome も制御します。インターフェースレス モードはヘッドレス モードとも呼ばれます。

pyantomjsドライバーの使用

pyantomjs ドライバーの使用は推奨されません。pyantomjs メソッドは Selenium によって削除されました。

ダウンロードリンク:http://phantomjs.org/download.html

使用法

# 导入模块
import time

from selenium import webdriver

# 创建浏览器对象
browser = webdriver.PhantomJS(executable_path=r"D:\Development\phantomjs-2.1.1-windows\bin\phantomjs.exe")

# 指定操作浏览器对象的行为
# 让浏览器访问网页
browser.get("https://www.baidu.com/")
# 保存截图调试
browser.save_screenshot('screenshot.png')

例外 1:

新しいバージョンの Selenium では PhantomJS が廃止されたため、AttributeError: module 'selenium.webdriver' has no attribute 'PhantomJS'例外が発生します。

セレンをアンインストールする

pip uninstall selenium

指定されたバージョンの Selenium をインストールします

pip install selenium==3.14.0

例外 2:

selenium.common.exceptions.WebDriverException: Message: 'phantomjs.exe' executable needs to be in PATH. 

解決策 1: フルパスの前に r を追加します。

browser = webdriver.PhantomJS(executable_path=r"D:\Development\phantomjs-2.1.1-windows\bin\phantomjs.exe")

解決策 2: bin ファイルへのパスをシステム変数に追加します。

C:\Users\Admin>phantomjs -v
2.1.1

Chrome の起動パラメータを設定する

# 导入模块
from selenium import webdriver

# 创建浏览器对象,指定配置参数
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 开启无界面模式
options.add_argument('--disable-gpu')  # 禁用gpu
# 实例化带有配置对象的driver对象
browser = webdriver.Chrome('D:\Development\chromedriver_win32\chromedriver.exe', chrome_options=options)

# 指定操作浏览器对象的行为
# 让浏览器访问网页
browser.get("https://www.baidu.com/")
# 保存截图调试
browser.save_screenshot('screenshot.png')

その他の操作

ウィンドウの切り替え

ブラウザは複数の Web ページを開くことがあり、現在取得している Web ページ要素がどの形式であるかを特定する必要があります。ブラウザを介してウィンドウを切り替える.switch_to.window

# 获取当前所有的窗口
print(browser.window_handles)

# 获取当前选中窗体的名称
print(browser.current_window_handle)

print("切换前:", browser.title)

# 执行js新开一个标签页
js = 'window.open("https://www.baidu.com");'
browser.execute_script(js)
time.sleep(3)

# 获取当前所有的窗口
print(browser.window_handles)

# 切换窗体
browser.switch_to.window(browser.window_handles[1])
print("切换后:", browser.title)

ifrmeスイッチ

iframe は HTML で一般的に使用されるテクノロジーです。つまり、1 つのページが別の Web ページ内にネストされます。

ブラウザの Web ページには iframe Web ページが含まれている場合がありますが、Selenium はデフォルトではフレーム内のコンテンツにアクセスできないため、iframe Web ページ要素を取得する必要があります。browser.switch_to.frame 経由で iframe を切り替える

import time

# 导入模块
from selenium import webdriver

# 创建浏览器对象
# 参数驱动路径
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()

browser.get("https://mail.qq.com/cgi-bin/loginpage")
print("切换前:", browser.page_source)

# 获取iframe元素对象
iframe_element = browser.find_element(By.ID, 'login_frame')
# 切换 iframe
browser.switch_to.frame(iframe_element)
print("切换后:", browser.page_source)

# 切换回 主窗口
browser.switch_to.default_content()
print("切回后:", browser.page_source)

# 利用切换标签页的方式切出frame标签
# windows = driver.window_handles
# driver.switch_to.window(windows[0])
time.sleep(5)

# 退出浏览器
browser.quit()

ユーザーエージェントとプロキシを設定する

Selenium が Google Chrome を制御する場合、ユーザー エージェントはデフォルトで Google Chrome になり、置き換えることができます。

Selenium はプロキシ IP を使用してブラウザを制御することもできます。

options = webdriver.ChromeOptions()
# 切换User-Agent
options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1')
# 设置代理
options.add_argument('--proxy-server=代理服务器地址') # 设置代理
browser = webdriver.Chrome('./chromedriver',chrome_options=options)

Webページのソースコードを取得する

取得したWebページのソースコードは、JSページ実行後の結果ソースコードとなります。

browser.page_source

クッキーの操作

Selenium はページ内の Cookie の処理に役立ちます

获取所有Cookies
browser.get_cookies()

把cookie转化为字典
cookies_dict = {
    
    cookie['name']: cookie['value'] for cookie in browser.get_cookies()}

通过名字获取Cookie
browser.get_cookie()

添加Cookie
browser.add_cookie()

通过名字删除Cookie
browser.delete_cookie()

删除所有Cookie
browser.delete_all_cookies()

JavaScriptを実行する

Selenium を使用すると、ブラウザで指定された JS コードを実行できるようになります。

# js语句:滚动
js = 'window.scrollTo(0,document.body.scrollHeight)' 
# 执行js的方法
browser.execute_script(js) 

js ="alert("hello world")"
browser.execute_script(js)

ページ待機中

ページの読み込み処理中、Web サイトサーバーの応答を待つ時間が必要になるため、この処理中にタグ要素がまだ読み込まれていない可能性があり、同時にデータが取得されるため、ブラウザーが検索に失敗することがあります。操作する必要がある要素であるため、例外が発生します。このとき、プログラムは待機する必要がありますが、方法は 3 つあります。

分類を待っている Selenium ページ

强制等待
隐式等待
显式等待

1. 強制待機

設定時間が短すぎるため、要素がロードされません。設定に時間がかかりすぎて時間の無駄

time.sleep(秒数)

2.隠れて待っている

暗黙的待機は要素の配置を目的としています。暗黙的待機では、一定期間内に要素が正常に配置されたかどうかを判断する時間を設定します。完了した場合は、次のステップに進みます。設定時間内に測位が成功しなかった場合、読み込みタイムアウトが報告されます。

browser.implicitly_wait(等待时间)

3. 明示的な待機。各要素は独自のチェック条件を定義できます。

数秒ごとに待機条件が満たされているかどうかを確認し、満たされている場合は待機を中止し、後続のコードの実行を続行します。到達しない場合は、指定された時間を超えるまで待機し続け、タイムアウト例外が報告されます。

1. ページ待機を手動で実装する

t = time.time()
# 定义超时时间
timeout = 60

while True:
    try:
        # 超时时间间隔
        time.sleep(1)
        url_element = browser.find_element(BY.ID, "OK")
        break
    except:
        # 超时处理
        if time.time() - t > timeout:
            break
        pass

2. 明示的な待機 API を提供する

# 等待对象模块
from selenium.webdriver.support.wait import WebDriverWait
# 导入等待条件模块
from selenium.webdriver.support import expected_conditions as EC
# 导入查询元素模块
from selenium.webdriver.common.by import By

# 使用selenium api 实现显性等待
# 创建等待对象,传入:浏览器对象、超时时间、检查元素时间间隔
wait = WebDriverWait(browser, 60, 0.1)
# 检查元素是否存在,参数是一个元祖,元祖内部描述等待元素查询方案
# EC.presence_of_element_located()
# 检查元素是否可见
# EC.visibility_of_element_located()
url_element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "OK")))

おすすめ

転載: blog.csdn.net/qq_38628046/article/details/129055814