Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找XPath并提取文本&;循环中复选框/单选按钮的状态_Java_Selenium_Selenium Webdriver - Fatal编程技术网

Java 查找XPath并提取文本&;循环中复选框/单选按钮的状态

Java 查找XPath并提取文本&;循环中复选框/单选按钮的状态,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我有一个页面,需要从xpath中提取文本,以及与文本关联的收音机或复选框的状态。 每个元素都包含在一个名为“c-form-group”的类中,因此我编写了一个循环来迭代以提取“Text”,这将是页面上找到的4个元素。但是它在元素3和4上失败了,我的xpath肯定有问题。我还没有添加复选框/单选按钮的复选框 前两个元素返回我需要的值,然后在element3上失败 以下是我试图提取的4个文本元素: 计划B保修(出租车)和故障恢复 车辆资产保护-标准保险 负资产保障 您确认已收到VAP关键事实传单 下

我有一个页面,需要从xpath中提取文本,以及与文本关联的收音机或复选框的状态。 每个元素都包含在一个名为“c-form-group”的类中,因此我编写了一个循环来迭代以提取“Text”,这将是页面上找到的4个元素。但是它在元素3和4上失败了,我的xpath肯定有问题。我还没有添加复选框/单选按钮的复选框

前两个元素返回我需要的值,然后在element3上失败

以下是我试图提取的4个文本元素:

计划B保修(出租车)和故障恢复

车辆资产保护-标准保险

负资产保障

您确认已收到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);
    }
WebElement elem=driver.findElement(By.className(“c-form-group”);
系统输出打印项次(“a”);
List elementz=elem.findElements(By.xpath(//label[contains(@class,'c-option')]);
对于(int i=0;i
这是完整的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>

建议
保修选项:
产品建议(年):
计划B保修(出租车)和故障恢复
车辆资产保护选项:
车辆资产保护-标准保险
负资产保障
您确认已收到VAP关键事实传单?

我有点不明白你想做什么。您提到了从元素中获取文本以及获取复选框的状态。外循环和内循环上的XPath重叠。您的
elementz
列表是从包含
c-option
类的
LABEL
中提取出来的,但随后您从
elementz
中的一个元素开始,在XPath的第一部分重复搜索包含
c-option
类的
标签

有一种更简单的方法可以做到这一点。这些复选框/单选按钮中的每一个都是
输入
标记,并具有特定于其值的
名称

计划B保修(出租车)和故障恢复:

车辆资产保护-标准保障范围:

负资产覆盖率:

您确认已收到VAP关键事实传单?:

因此,有了这些信息,您可以使用CSS选择器获取每个
输入

By.cssSelector("input[name='warrantyPlan']")
一旦有了
INPUT
元素,就可以使用
.isSelected()
检查它是否被选中

如果你真的需要文本,你可以得到标签,因为它是我们刚刚得到的
输入的父项。我们可以使用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

我只做了前两个。您可以查看模式并将其应用于最后两个模式。

从第3和第4个xpath中删除
。在
之后以及
之前,仍然存在另一个问题:第三个和第四个xpath是
//标签[@class,
。这里有一个逗号
而不是等号
=
。修复:)你的循环变量i不正确。你是inc i,但你使用i1表示循环…语法现在正确:)这解决了我的过度复杂的解决方案。所有这些现在都可以工作了,文本和测试选定的…:-)