在Selenium IDE中,Locator可以使用XPath和storedVars

时间:2011-04-28 22:48:02

标签: selenium selenium-ide

我有一个XPath,它将选择我的特定单选按钮项 HTML。我想通过使用a来增强我的定位器以使其更具动态性 存储变量,表示我的XPath正在使用的文本 锁定。

这是我当前的设置

命令:点击

目标:

//*[contains(@for,'Page149.Question48.TypeChoiceOneAnswerRadioButton.holder_ctl02')
and text()="Below 70 – May be too low"]

我想替换文字“低于70 - 可能太低” 用变量。我提出的目标未能评估。我希望我 只是语法不正确。

我可以这样做吗?我可以将存储的变量与XPath定位器一起使用吗?

提议目标:

//*[contains(@for,'Page149.Question48.TypeChoiceOneAnswerRadioButton.holder_ctl02')
and text()=${radioText}] 

编辑:添加代码。我做了一个简单的HTML单选按钮列表示例,并隔离了我的Selenium命令。我在Firefox中使用Selenium IDE。我的命令示例有注释。

示例HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Untitled Page</title>
</head>
<body>
    <table border="0" class="srvy_radiobuttonlist" id="ctl00_cphSurveyControls_surveyCategoryPage_Page51.Question5.TypeChoiceOneAnswerRadioButton.holder_ctl02">
        <tbody>
            <tr>
                <td>
                    <input type="radio" checked="checked" value="Page51.Question5.Answer580" name="ctl00$cphSurveyControls$surveyCategoryPage$Page51.Question5.TypeChoiceOneAnswerRadioButton.holder$ctl02"
                        id="ctl00_cphSurveyControls_surveyCategoryPage_Page51.Question5.TypeChoiceOneAnswerRadioButton.holder_ctl02_0"><label
                            for="ctl00_cphSurveyControls_surveyCategoryPage_Page51.Question5.TypeChoiceOneAnswerRadioButton.holder_ctl02_0">Male</label>
                </td>
                <td>
                    <input type="radio" value="Page51.Question5.Answer581" name="ctl00$cphSurveyControls$surveyCategoryPage$Page51.Question5.TypeChoiceOneAnswerRadioButton.holder$ctl02"
                        id="ctl00_cphSurveyControls_surveyCategoryPage_Page51.Question5.TypeChoiceOneAnswerRadioButton.holder_ctl02_1"><label
                            for="ctl00_cphSurveyControls_surveyCategoryPage_Page51.Question5.TypeChoiceOneAnswerRadioButton.holder_ctl02_1">Female</label>
                </td>
            </tr>
        </tbody>
    </table>
</body>
</html>

嘲笑Selenium IDE

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="http://localhost" />
<title>LocatorTest</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">LocatorTest</td></tr>
</thead><tbody>
<!--Select Male-->
<tr>
    <td>click</td>
    <td>//*[contains(@id,'Page51.Question5.TypeChoiceOneAnswerRadioButton.holder_ctl02_0')]</td>
    <td></td>
</tr>
<tr>
    <td>store</td>
    <td>Female</td>
    <td>Gender</td>
</tr>
<tr>
    <td>assertTextPresent</td>
    <td>${Gender}</td>
    <td></td>
</tr>
<tr>
    <td>assertTextPresent</td>
    <td>javascript{ storedVars['Gender']}</td>
    <td></td>
</tr>
<!--FYI, locates first item in radio collection-->
<tr>
    <td>click</td>
    <td>//*[contains(@for,'Page51.Question5.TypeChoiceOneAnswerRadioButton.holder_ctl02')]</td>
    <td></td>
</tr>
<!--Works to select female-->
<tr>
    <td>click</td>
    <td>//*[contains(@for,'Page51.Question5.TypeChoiceOneAnswerRadioButton.holder_ctl02') and text()='Female']</td>
    <td></td>
</tr>
<tr>
    <td>click</td>
    <td>//*[contains(@for,'Page51.Question5.TypeChoiceOneAnswerRadioButton.holder_ctl02') and contains(text(),'Female')]</td>
    <td></td>
</tr>
<!---- not found -->
<tr>
    <td>click</td>
    <td>//*[contains(@for,'Page51.Question5.TypeChoiceOneAnswerRadioButton.holder_ctl02') and contains(text(),${Gender})]</td>
    <td></td>
</tr>
<!--Works to select female-->
<tr>
    <td>click</td>
    <td>//*[contains(text(),'Female')]</td>
    <td></td>
</tr>
<!---- not found -->
<tr>
    <td>click</td>
    <td>//*[contains(text(),${Gender})]</td>
    <td></td>
</tr>
</tbody></table>
</body>
</html>

3 个答案:

答案 0 :(得分:4)

变量周围需要引号。

//*[contains(text(),'${Gender}')]

是的,我已经成功地使用了存储变量的XPath定位器,虽然它不是'click'而是'waitForXpathCount'。起初它没有用,我不得不求助于printf-debugging来实现目标。它不起作用的原因在这里(我没有适当地设置目标),但我认为相关文件的列表将对那些遇到Selenium IDE问题的人感兴趣。

Mac上文件的位置:

  

〜/ Library / Application Support / Firefox / Profiles / [your profile] / extensions / {a6fd85ed-e919-4a43-a5af-8da18bda539f} / chrome / content / selenium-core / scripts /

重要文件:

  • 硒 - api.js
    核心命令处理程序。恩。 Selenium.prototype.doClick
  • 硒 - browserbot.js
    负责与浏览器的接口。例如,上面的doClick处理程序会调用BrowserBot.prototype.findElement
  • 硒 - executionloop.js
    调用命令处理程序。最重要的是,在这种情况下,使用selenium.preprocessParameter(command.target)预处理定位器字符串。 selenium.preprocessParameter可以找到selenium-api.js
  • htmlutils.js
    提供XPathEvaluator

如何打印到IDE日志:

LOG.error("Useful debugging information");

每次更改Selenium IDE的内部时都需要重新启动Firefox(我找不到动态重新加载它的方法)。

此外,您可以在普通的Firefox JS控制台上测试XPath表达式,如$x("xpath/expr/with/stored/variables/replaced/accordingly")

答案 1 :(得分:0)

您选择的HTML元素是什么?你能提供HTML吗?是的,这是可能的。你使用什么装订?即。 Python,Ruby,Java ???

您可以这样做:

var = selenium.get_eval(locator)

答案 2 :(得分:0)

是的,这应该可以正常工作。 documentation显示了一个简单示例:

type    |   textElement |   Full name is: ${fullname}

显而易见的问题是“你从哪里获得了radioText的价值?”,紧接着是“你确定其中没有其他文字吗?” (因为您编写了“text()='xxx'”,而不是“contains(text(), '...')”。或者您可能确实在代码中省略了引号,而不仅仅是在您的示例中( ie ,“ text()=xxx“,而不是”text()='xxx'“)?