09_よく使われる方法

1. ウィンドウを最大化および最小化する

  • driver.maximize_window()
  • driver.minimize_window()

2. ブラウザナビゲーション

  • driver.back() ブラウザ履歴を後方に移動します
  • driver.forward() はブラウザ履歴を前方に移動します
  • driver.refresh() ページを更新/再読み込みします

3. ウィンドウを切り替える

  • driver.switch_to.frame('login_frame') は、ID、名前、要素 (位置決めされた要素)、およびインデックスを介してフレームに切り替えます
  • driver.switch_to.active_element は、現在フォーカスされている要素を見つけます。
  • driver.switch_to.parent_frame() は前のページに切り替えます
  • driver.window_handles は、現在のブラウザのすべてのウィンドウ ハンドルを取得します
  • driver.current_window_handle は現在のウィンドウのハンドルを取得します
  • driver.switch_to.window(h) は、(ハンドルに従って) ブラウザウィンドウを切り替えます。
    • driver.switch_to.window(handles[-1]) 最後に開いたウィンドウに切り替える
    • driver.switch_to.window(handles[-2]) 最後から 2 番目に開いているウィンドウに切り替えます
    • driver.switch_to.window(handles[0]) 最初に開いていたウィンドウに切り替える
  • driver.switch_to.default_content() トップページに切り替える
  • 注: フレーム タグには、frameset、frame、iframe の 3 種類があります。frameset は他の通常のタグと変わりなく、通常の配置には影響しません。ただし、frame と iframe は、配置する前にフレームを切り替える必要があります。フレームはレイヤーごとにカットする必要があります。

4.Webページをスクロールする

  • 方法 1: スライドするピクセル数を修正する
    • スクロール バーが HTML 全体に対応している場合は、次の方法を使用できます。
      • js = “var q=document.documentElement.scrollTop=10000” # document.documentElement はルート ノード要素を取得することを意味します
      • driver.execute_script(js)
    • スクロールバーが本文全体の場合は、次の方法を使用できます。
      • js = “var q=document.body.scrollTop=10000” # document.body は body ノード要素を取得することを意味します
      • driver.execute_script(js)
    • スクロール バーが特定の div のものである場合は、次の方法を使用できます。ページのスクロール バーは、class='main' の div のものです。
      • js = "var q=document.getElementsByClassName('main')[0].scrollTop = 10000" # getElementsByClassName は class='main' で要素リストを取得することを意味します。0 は最初のものを意味するため、インデックスを追加する必要があります使用するとき。getElementById の場合、インデックス作成は必要ありません。
      • driver.execute_script(js)
  • 方法 2: 要素の位置までスライドする
    • target = driver.find_element_by_xpath(“//b[contains(text(),'网页')]”)
    • driver.execute_script(“arguments[0].scrollIntoView();”, target)
    • 注: 引数オブジェクトは、すべての関数で使用できるローカル変数です。引数オブジェクトを使用して、関数内で関数のパラメータを参照できます。このオブジェクトには関数に渡される各引数が含まれており、最初の引数のインデックスは 0 です。たとえば、関数に 3 つの引数が渡された場合、arguments[0]、arguments[1]、arguments[2] のように参照できます。
    • scrollIntoViewはページ(コンテナ)のスクロールに関するAPIです
      • element.scrollIntoView() パラメータのデフォルトは true
      • パラメータは true です。この関数が呼び出されると、ページは要素の上部がビュー (コンテナー) の上部と揃うようにスクロールを送信します。
      • パラメータは false です。要素の下部をビュー (コンテナー) の下部に揃えます。
  • 方法3:Window.scrollTo()
    • scrollTo() メソッドは、指定された座標までコンテンツをスクロールできます。
      • スクロールTo(xpos,ypos)
      • パラメータの説明:
      • xposが必要です。ウィンドウのドキュメント表示領域の左上隅に表示されるドキュメントの x 座標。
      • yposが必要です。ウィンドウのドキュメント表示領域の左上隅に表示されるドキュメントの y 座標。
    • 高さの求め方(一部)
      • document.documentElement.scrollHeight すべてのブラウザ コンテンツの高さ
      • document.body.scrollHeight すべてのブラウザ コンテンツの高さ
      • document.documentElement.scrollTop ブラウザのスクロール部分の高さ
      • document.body.scrollTop は常に 0 です
      • document.documentElement.clientHeight ブラウザの表示部分の高さ
      • document.body.clientHeight すべてのブラウザ コンテンツの高さ
      • #ページの一番下までスクロールします
      • driver.execute_script(“window.scrollTo(0,document.body.scrollHeight)”)
      • #ページの一番上までスクロールします
      • driver.execute_script(“window.scrollTo(document.body.scrollHeight,0)”)

5.待ち時間

  • 強制待機
    • time.sleep(): 一定の待ち時間を設定します。使い方は簡単です。この行の要素のみを検索します。設定した時間内に要素が見つかったら、次のコードを実行し続けます。時間内に完了しない場合は、次のコードを実行します。指定された時間になると、ロード時に例外がスローされます。これには頻繁な設定が必要となり、コードの実行時間が長くなります。
    • 強制待機使用シナリオ: ページの読み込み
    • 例: time.sleep(2) は 2 秒の待機を強制し、インポート時間が必要です
  • 暗黙的な待機
    • implicitly_wait(): すべての要素に設定する待ち時間について、待ち時間の範囲を設定します。この待ち時間は固定ではありません。最長待ち時間は設定した最大値を超えません。最初に 1 回だけ設定する必要があります。プロジェクトの。 はグローバルに有効になり、ネットワークの影響を受けて読み込みが遅いコントロールに使用するには不便です。
    • 暗黙的な待機の使用シナリオ: ページを開いた後
    • 例: driver.implicitly_wait(10) #ここでスマート待機を 10 秒に設定します
  • 明示的な待機
    • WebDriverWait(): 特定の要素の待ち時間を設定し、ページ全体で要素を検索し、設定された時間内に要素が見つかった場合は、指定された時間内に完了しない場合は次のコードの実行を継続します。ロード時に例外がスローされます。コントロールを見つける最大待機時間と頻度を設定できます。ネットワークの影響を受け、ロードが遅いコントロールに使用するのが簡単です。
    • 待機中の使用シナリオを表示: 要素を検索するとき
    • 例:
      • WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID, “frame_html_setting”)))
        • until も WebDriverWait に属し、要素が表示されるまで待機することを意味しますが、Until_not はその逆で、要素が存在しなくなるまで判断します。
        • present_of_element_located は主に、ページ要素の Frame_html_setting がページ内に存在するかどうかを決定します。
      • WebDriverWait(driver,10).until_not(EC.presence_of_element_located((By.XPATH, "//a[text()='エンタープライズ メールボックス']")))

6. スクリーンショット

  • get_screenshot_as_file()
    • driver.get_screenshot_as_file('/Users/dengchunmei/PycharmProjects/AutomatedTestingDemo/picture/baidu.png')
  • save_screenshot()
    • driver.save_screenshot('baidu1.png')
  • スクロールスクリーンショット
    • 原則: ページをスクロールして複数の +PIL 画像をキャプチャし、それらをつなぎ合わせて全画面スクリーンショットを作成します。
    • ステップ:
      • 最大表示範囲を取得するフルスクリーンウィンドウ、get_window_size()で画面の高さを取得、jsを実行してページの高さを取得します。
      • 割ってロール数を取得します。
      • スクロールするたびにスクリーンショットを保存し、[画像] を使用してスクリーンショットを開き、2 次元マトリックスに変換し、前の画像の 2 次元マトリックスに結合します。
      • ループが完了すると、結合された 2 次元行列が最終的に画像に出力されます。
    • 前提条件: PIL と numpy をインストールする必要があります: pip3 インストールpillow、pip3 インストール Numpy
    • コード:
from PIL import Image
    import numpy as np
    window_height = driver.get_window_size()['height']  # 窗口高度
    page_height = driver.execute_script('return document.documentElement.scrollHeight')  # 页面高度
    driver.save_screenshot('baidu.png')
    if page_height > window_height:
        n = page_height // window_height  # 需要滚动的次数
        base_mat = np.atleast_2d(Image.open('baidu.png'))  # 打开截图并转为二维矩阵
        for i in range(n):
        driver.execute_script(f'document.documentElement.scrollTop={
      
      window_height * (i + 1)};')
            time.sleep(5)
            driver.save_screenshot(f'baidu_{
      
      i}.png')  # 保存截图(全页面)
            mat = np.atleast_2d(Image.open(f'baidu_{
      
      i}.png'))  # 打开截图并转为二维矩阵
            base_mat = np.append(base_mat, mat, axis=0)  # 拼接图片的二维矩阵
        Image.fromarray(base_mat).save('baidu123.png')

7. 要素の属性を変更します
(日付選択コントロールが入力タグで読み取り専用の場合、読み取り専用を削除して値を割り当てることができます)

  • 読み取り専用属性を設定する
    • js = “document.getElementById('kw').readOnly=true”
    • driver.execute_script(js)
  • 読み取り専用属性を削除する
    • js='document.getElementById(“kw”).removeAttribute(“readonly”)'
    • driver.execute_script(js)

おすすめ

転載: blog.csdn.net/dcm1324659876/article/details/132366474