我有一个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>
答案 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 /
重要文件:
Selenium.prototype.doClick
doClick
处理程序会调用BrowserBot.prototype.findElement
。selenium.preprocessParameter(command.target)
预处理定位器字符串。 selenium.preprocessParameter
可以找到selenium-api.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'
“)?