Xpath的。无法选择标签文本 - 当<input />之类的其他元素位于<label>标签之间时

时间:2017-05-09 14:58:14

标签: java html selenium xpath cucumber

Java dev和Xpath的新手。谷歌搜索和RTFM编辑相当多但卡住了。公司有一个使用Java Wicket框架用Java编写的大型Web应用程序。将Selenium与Cucumber和Junit结合使用进行测试。因此需要编写许多Xpath表达式。 坚持以下内容。

一个带有表单的屏幕,两个切换()和文本在其后面。相关摘要。

    <label>
    <input id="idf1" name="removeConditionViaTreeStep:resultsRadioGroup" value="radio3" checked="checked" type="radio"> 
    Safe to delete
    </label>

    <label>
    <input id="idf2" name="removeConditionViaTreeStep:resultsRadioGroup" value="radio4" type="radio">
    Unsafe to delete
    </label>

注意:使用Wicket框架意味着每次应用程序运行时属性id和值都可以不同,因此不能使用它们。也不能改变HTML。

计划A 我想通过使用标签文本作为uniq选择器来选择特定的切换(并模拟单击/选择它),但是标签之间的事实......给了我一些问题。在干净的标签情况下,我可以毫无问题地选择某个标签。 在这种情况下,无法使用//标签[包含(text(),&#39;不安全删除&#39;)]。

放弃并选择B计划。

使用firepath addon for firebug进行测试,得出以下信息://输入[@name =&#39; removeConditionViaTreeStep:resultsRadioGroup&#39;] 这导致两个匹配中的firepath。我希望使用像[2]这样的东西来选择第二个切换,但是无法弄明白。

计划C - 借助Java和Xpath工作。
List elements = findElementsByXpath(&#34; //输入[@name =&#39; removeConditionViaTreeStep:resultsRadioGroup&#39;]&#34;); elements.get(1)//选择第二个切换。

有这种感觉&#34; //标签[包含(文字(),&#39;不安全删除&#39;)]#34;不起作用,因为一切都是流式的,并且硒的Webdriver没有记忆。因此,元素打破了流或类似的......

也许有人可以为计划A和B提供一些提示和指示甚至解决方案。

编辑纠正了Bill Hileman提到的右括号拼写错误。

2 个答案:

答案 0 :(得分:0)

我知道你说你不能改变HTML,但也许你可以在测试环境中以wickets开发模式运行应用程序?这样,如果我没记错的话,应该渲染color = mix(color, vec3(0.0,1.0,0.0), pct); ,您可以更轻松地选择元素。

答案 1 :(得分:0)

您输入的xpath尝试是:

function getIValues(){
    var url = "./Servlet?ajaxAction=getIDetail&id="+id;
    ajaxRequestForChange(url,"I");
}

function getFValues(){
    var url = "./Servlet?ajaxAction=getFDetail&id="+id;
    ajaxRequestForChange(url,"F");
}

function getCValues(){
    var url = "./Servlet?ajaxAction=getCDetail&id="+id;
    ajaxRequestForChange(url,"C");
}

var ajaxRequestForChange = function(url,fun) {
        var strURL = url;
        var xmlHttpRequest = false;
        var self = this;
        // Mozilla, Safari
        if (window.XMLHttpRequest) {
            self.xmlHttpRequest = new XMLHttpRequest();
        } else if (window.ActiveXObject) { // IE
            self.xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        }
        self.xmlHttpRequest.open("POST", strURL, true);
        self.xmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        self.xmlHttpRequest.onreadystatechange = function() {
            if (self.xmlHttpRequest.readyState == 4) {
                if (self.xmlHttpRequest.status == 200) {
                    var htmlString = self.xmlHttpRequest.responseText;

                    if(fun == 'I'){
                        setIValues(htmlString);
                    }
                    if(fun == 'F'){
                        setFValues(htmlString);
                    }
                    if(fun == 'C'){
                        setCValues(htmlString);
                    }

                } else {
                    ajaxFailedCount++;
                    // Try for 1 min (temp fix for racing condition)
                    if (ajaxFailedCount < 1200) {window.setTimeout(function() {ajaxRequest(url)}, 50);}
                    else {alert("Refresh failed!")};
                }
            }
        }
        self.xmlHttpRequest.send(null);
    }

除非这只是一个拼写错误,否则你错过了一个右括号。

//label[contains(text(),'Unsafe to delete'] 

该xpath应该可以工作。