python3--selenium--unittest.長い間使用されていなかったUIの作成自動化で発生した問題および解決策【問題6-10】

4547 ワード

前言:自動化テストには使用制限が多く、しばらくは使用できない疎期があります.この文章を通じてプロジェクト作成プログラムで出会った問題と解決構想を記録し、今後の自動化開発に役立つことを望んでいる.
本編では5つの質問を記録します.
質問6:リスト内の、行全体のデータを取得する方法
問題7:データが取得できない多くの原因の1つ:リスト内の同じ位置要素、htmlフォーマットが異なる.
問題8:forループとtry使用エラー
質問9:Webページが開いているかどうかを確認する方法の1つ:titleの使用
質問10:seleniumアクションドロップダウン・オプションの内容
 
質問6:リストから整理額データを統合する方法:
操作ページでは、seleniumを使用してリストのすべてのデータを取得すると、リストが表示されることがよくあります.現在実行可能な方法の核心はForループ+Xpathパスである.
1.フォームtbody全体のxpathパスを取得する:list=driver.find_element_by_xpath("//*[@id="***"]/tbody")
2.有効なデータの第1行、第1列のデータを取得する:test_click = list.driver.find_element_by_xpath("//*[@id="***"]/tbody/tr[1]/td[1]/b").このステップは実際にリストを適用しなくてもよく、参照リストは特定のリストに範囲を縮小することができます.ページにリストが1つしかない場合はlistを取得する必要はありません
3.有効なデータを取得する2行目、1列目のデータ:test_click2 = list.driver.find_element_by_xpath("//*[@id="***"]/tbody/tr[2]/td[1]/b")
4.有効なデータの第1行、第2列のデータを取得する:test_click3 = list.driver.find_element_by_xpath("//*[@id="***"]/tbody/tr[1]/td[2]/b")
規則に従って、特定のカラムのデータを取得する場合は、次のようにします.
test_list = []
for i in range(1,最大列数):
    test_list.append(list.driver.find_element_by_xpath("//*[@id="***"]/tbody/tr[{}]/td[1]/b".format(i)))
特定の行を取るのも似ています.
 
問題7:データが取得できない多くの原因の1つ:リスト内の同じ位置要素、htmlフォーマットが異なる.
htmlページの一部のフィールドは、表示内容によってhtmlの名前の内容が異なります.seleniumが処理しないと、要素が見つからないためにプログラムが実行され、エラーが発生します.NoSuchElementException.この問題を処理するには,通常異常処理【try,except,else,final】を用いる.
       

try:
//              html    ,       xpath   
    Status = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[4]/b'%count).text
    
except NoSuchElementException:  //        ,          
    Status = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[4]/font/b/b' % count)
    count_parren = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[4]/'% count).text
    count = re.search('\(\d\)', count_parren).group()
final: driver.quit()  //       

問題8:forループとtry使用エラー
主にtryの使い方の不理解による問題です.
try:実行中のメソッドにエラーが発生すると、tryのコードが直接飛び出します.エラーを発見してbreakを実行したことに相当します.したがってtryにforループが書き込まれると、実行内容に異常が発生すると、forループ全体が飛び出します.
解決策も簡単で、値はtryをforループに書く必要があります.

for count in range(1,len(Application_List)+1):
    try:
        Applation = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[1]/b'%count).text
    except NoSuchElementException:
        break

質問9:Webページが開いているかどうかを確認する方法の1つ:titleの使用
自動化の要件は、アクセスアドレスがサービスが開始されたかどうかを判断することです.必要に応じて、そのサイトの特定のフィールドをキャプチャし、起動してもキャプチャできるようにすることを考慮します.このシナリオの問題は,各ページの内容が一致せず,それぞれが書く必要があり,大変であることである.だから、すべてのページが使用されているが、内容が異なるページを区別したり、起動しているかどうかを検証したりしたいと思っています.この時が先だ
ラベルはラベルに含まれる唯一のものです.だからhtmlページであれば必ずtitleがあります.また、ページを区別するためには、フロントエンド開発ではページごとに異なる名前をつけるのが一般的です.

seleniumにもtitleを取る方法があります:driver.title


開発コンテンツは、提供されたアドレスに基づいてtitleを取得し、プロファイルに書き込む2つのステップに分けられます.


最初のステップは、titleを取るプロセスを自動化して実行し、titleを印刷してexcelにコピーして貼り付けます.もちろんexcleに直接書き込むこともできますが、面倒で、一度に完成する内容なのか、手動で操作するほうが速いのか.


第2部、実際にテストするときはtitleとプロファイルの比較をとります.


for Key, Value in URL_Dict.items():
#コンテンツの の
driver = browser_config['chrome']()
uihandle = UIHandle(driver)
try:
uihandle.get(Value[0])
sleep(2)
#ログインページのTitle の
Server_Title = driver.title
# したTitleはconfigのtitleと され、 なる はページが していないことを します.
if Server_Title == Value[1]:
#print("{Key}:{url}が しました".format(Key=Key,url=Value[0]))
self.TestReport['Total_Success'] += 1
else:
print('*'* 50)
print(「{Key}:{url} が していません」.format(Key=Key,url=Value[0]))
self.TestReport['Total_Failures'] += 1
self.TestReport["Error_Report"].append("""{Key}:{url}
このアドレスの が していません
""".format(Key=Key, url=Value[0]))
except InvalidArgumentException:
self.TestReport["Error_Report"].append("""{Key}:{url}
このアドレスにアクセスできません
""".format(Key = Key, url = Value[0]))
self.TestReport['Total_Failures'] += 1
finally:
driver.quit()

問題10:seleniumアクションドロップダウンオプション内容


UI自動化では、ドロップダウン・オプションをクリックすることがよくあります.現在実行可能な方法は、コントロールの位置とオプションの位置を先に取得することです.次にコントロールをクリックしてからオプションをクリックします.オプション選択

を完了

uihandle.Click(「フロントエンド」,「 」)
uihandle.Click(「フロントエンド」,' ')