2017-12-08 1 views
-1

xpathからテキストを抽出する必要があるページと、テキストに関連付けられたラジオまたはチェックボックスのステータスがあります。 各要素は "c-form-group"と呼ばれるクラスに含まれているので、 "Text"を抽出するために反復処理を行い、ページ上にある4つの要素を抽出します。しかし、それは要素3 & 4で失敗している、私は私のxpathに何か間違っている必要があります。チェックボックス/ラジオボタンのチェックをまだ追加していません。ループ内のxpathsを見つけ、テキストとチェックボックス/ラジオボタンの状態を抽出します。

最初の2つの要素が必要な値を返していて、次にelement3で失敗します。標準のカバー

負のエクイティ・カバー

-

プランB保証(タクシー)&内訳回復

車資産の保護:ここ

は私が抽出しようとしています4つのテキスト要素がありますあなたはVAPの事実のリーフレットを受け取ったことを確認しますか?

ここにループのコードを示します。

WebElement elem = driver.findElement(By.className("c-form-group")); 
System.out.println("a");  
List<WebElement> elementz = elem.findElements(By.xpath("//label[contains(@class,'c-option')]")); 

for(int i = 0 ; i< elementz.size() ; i++){ 
    System.out.println("Loop : " + i); 
    String vapval1 = elementz.get(i).findElement(By.xpath("//label[@class='c-option c-option--right u-px u-py-sm u-clearfix ng-scope' and not(@class='ng-pristine ng-untouched ng-valid ng-valid-required') and not (@class='c-option__radio')]")).getText(); 
    System.out.println("0 = " + vapval1); 
    String vapval2 = elementz.get(i).findElement(By.xpath("//label[@class='c-option c-option--right u-px u-py-sm u-clearfix' and not(@class='ng-pristine ng-untouched ng-valid ng-valid-required') and not (@class='c-option__radio')]")).getText(); 
    System.out.println("1 = " + vapval2); 
    String vapval3 = elementz.get(i).findElement(By.xpath("//label[@class,'c-option c-option--right u-px u-py-sm u-clearfix ng-scope' and not(@class='ng-pristine ng-untouched ng-valid') and not (@class='c-option__checkbox')]")).getText(); 
    System.out.println("3 = " + vapval3); 
    String vapval4 = elementz.get(i).findElement(By.xpath("//label[@class,'c-option c-option--right u-px u-py-sm u-clearfix' and not(@class='ng-pristine ng-untouched ng-valid ng-valid-required') and not (@class='c-option__checkbox')]")).getText(); 
    System.out.println("4 = " + vapval4); 
    } 

これは完全なhtmlです。

<!DOCTYPE html> 
<html class="ng-scope" ng-app="dan"> 
<head> 
<body class="u-scroll-y ng-scope" ng-controller="CoreController as cc"> 
<div class="c-animate c-animate--show u-pos-f-t ng-hide" ng-show="global.alerts.length"> 
<div class="o-grid-fluid u-h-100 u-pl-0"> 
<div class="o-grid__row u-ml-0 u-h-100"> 
<div class="c-loader ng-hide" ng-show="loadingHome" style=""> 
<nav class="o-grid__col-xl-2 o-grid__col-lg-3 o-grid__col-xs-4 u-p-0 c-card__block u-h-100 u-shadowed u-pos-f-t ng-scope" ng-if="global.loggedIn"> 
<div class="u-p-0 u-h-100 o-grid__col-xl-10 o-grid__col-lg-9 o-grid__col-xs-8 u-pull-right" ng-class="{ 'o-grid__col-xl-10 o-grid__col-lg-9 o-grid__col-xs-8 u-pull-right' : global.loggedIn }"> 
<header class="o-layout-table__row u-bg-primary u-shadowed u-clearfix u-px ng-scope" ng-if="global.loggedIn"> 
<main class="o-view-container"> 
<div class="o-grid-fluid u-py-md"> 
<div class="o-grid__row"> 
<div class="c-animate c-animate--view-slide-in-right c-animate--view-slide-out-right ng-scope" ng-view="" style=""> 
<div class="o-grid__col-md-10 o-grid__col-xl-8 o-grid__col-xl-offset-2 o-grid__col-md-offset-1 ng-scope"> 
<div class="u-mb-lg u-text-center"> 
<h1 class="u-text-bold">Recommendations</h1> 
</div> 
<form class="ng-valid ng-valid-min ng-valid-max ng-valid-required ng-dirty ng-valid-parse" name="recommend" ng-submit="recommend.$valid" style=""> 
<div class="o-media c-card c-card__block u-shadowed u-mb-lg ng-scope" ng-if="rc.WarrantyEligible && !rc.prevWarranty()"> 
<label class="c-form-control-label u-px u-py-sm u-w-100">Warranty Options:</label> 
<div class="c-form-group u-p-0 u-mb-sm u-clearfix"> 
<div class="o-grid__col-md-8"> 
<label class="c-form-control-label u-text-normal">Product Recommendations (Years):</label> 
</div> 
<div class="o-grid__col-md-4"> 
<input class="c-form-control ng-pristine ng-untouched ng-valid ng-valid-min ng-valid-max ng-valid-required" required="" placeholder="Years" ng-model="rc.recommend.year" min="1" max="3" type="number"> 
</div> 
</div> 
<div class="c-form-group ng-scope" ng-if="data.answer_taxi"> 
<label class="c-option c-option--right u-px u-py-sm u-clearfix ng-scope" ng-if="!rc.planA && !rc.prestige" ng-click="cc.utils.audit('recommendation_warranty_plan_taxi_b')"> 
<input class="ng-pristine ng-untouched ng-valid ng-valid-required" required="" ng-model="rc.recommend.warrantyPlan" value="taxiB" name="warrantyPlan" type="radio"> 
<i class="c-option__radio"></i> 
Plan B Warranty (Taxi) & Breakdown Recovery 
</label> 
</div> 
</div> 
<div class="o-media c-card c-card__block u-shadowed u-mb-lg u-text-body u-bg-success" ng-if="!rc.prevVap() && rc.VapEligible "> 
<div class="c-form-group"> 
<label class="c-form-control-label u-px u-py-sm u-w-100">Vehicle Asset Protection Options:</label> 
<label class="c-option c-option--right u-px u-py-sm u-clearfix" ng-click="cc.utils.audit('recommend_vap')"> 
<input class="ng-pristine ng-untouched ng-valid ng-valid-required" required="" ng-model="rc.recommend.vapPlan.plan" value="standard" name="vapPlan" type="radio"> 
<i class="c-option__radio"></i> 
Vehicle Asset Protection - Standard Cover 
</label> 
<label class="c-option c-option--right u-px u-py-sm u-clearfix ng-scope" ng-if="data.answer_equity == true" ng-click="cc.utils.audit('recommend_negative_equity')"> 
<input class="ng-untouched ng-valid ng-dirty ng-valid-parse" ng-model="rc.recommend.vapPlan.equity" name="vapPlanEquity" type="checkbox" style=""> 
<i class="c-option__checkbox"></i> 
Negative Equity Cover 
</label> 
<label class="c-option c-option--right u-px u-py-sm u-clearfix" ng-click="cc.utils.audit('vap_key_facts_checked')"> 
<input class="ng-pristine ng-untouched ng-valid ng-valid-required" required="" ng-model="rc.recommend.vapCheck" name="vapCheck" type="checkbox"> 
<i class="c-option__checkbox"></i> 
You confirm that you have received the VAP key facts leaflet? 
</label> 
</div> 
</div> 
</form> 
<div class="c-form-group"> 
</div> 
</div> 
</div> 
</div> 
</main> 
</div> 
</div> 
</div> 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"> 
<script src="./build/app.js?v=2.13" defer=""> 
<script src="/build/standalone/jspdf.js" defer=""> 
<script src="/build/standalone/sigWebTablet.js" defer=""> 
</body> 
</html> 
+0

3番目と4番目のxpathから ')'を削除します。 'class'の後で'と 'の前に'と 'のあとに –

+0

が見つかりましたが、まだ:" xpath式で要素を見つけることができません " –

+0

もう一つの問題があります:3番目と4番目のxpathは' // label [@ class、 '。 '= 'の代わりにコンマ'、 'があります。それを修正してください:) –

答えて

1

私はあなたが何をしようとしているのか少し混乱しています。要素からテキストを取得し、チェックボックスの状態を取得することに言及します。外側ループと内側ループのXPathが重複しています。 elementzリストは、c-optionクラスを含むLABELから取得されますが、elementzの要素で始まり、XPathの最初の部分は、c-optionクラスを含むLABELの検索を繰り返します。

これを実行する方がずっと簡単です。これらのチェックボックス/ラジオボタンはそれぞれINPUTタグで、値に固有のnameです。

プランB保証(タクシー)&内訳回復:<input ... name="warrantyPlan" type="radio">

車資産の保護 - 標準カバー:<input ... name="vapPlan" type="radio">

負のエクイティ・カバー:あなたはVAP重要な事実を受けていることを確認<input ... name="vapPlanEquity" type="checkbox" style="">

リーフレット?:<input ... name="vapCheck" type="checkbox">

この情報では、それぞれを得ることができますあなたがINPUT要素を持っていたら、それは.isSelected()を使用して選択されている場合

By.cssSelector("input[name='warrantyPlan']") 

のようなCSSセレクタ0は、あなたがチェックすることができます。

本当にテキストが必要な場合は、今すぐ取得したINPUTの親であるため、ラベルを取得できます。現在の要素の親を取得するXPath、By.xpath("..")でこれを行うことができます。

私たちは、私はちょうど最初の二つをした

// Plan B Warranty (Taxi) & Breakdown Recovery 
WebElement e = driver.findElement(By.cssSelector("input[name='warrantyPlan']")); 
System.out.println(e.isSelected()); // false 
System.out.println(e.findElement(By.xpath("..")).getText()); // Plan B Warranty (Taxi) & Breakdown Recovery 

// Vehicle Asset Protection - Standard Cover 
e = driver.findElement(By.cssSelector("input[name='vapPlan']")); 
System.out.println(e.isSelected()); // false 
System.out.println(e.findElement(By.xpath("..")).getText()); // Vehicle Asset Protection - Standard Cover 

のようにすべて一緒にこれを置くことができます。パターンを見て最後の2つに適用することができます。

+0

それは私の複雑すぎる解決策を解決しました。 すべての作業、テキスト、選択したテスト... :-) –

関連する問題