В Selenium IDE может ли Locator использовать XPath и сохраненные переменные - PullRequest
4 голосов
/ 29 апреля 2011

У меня есть XPath, который выберет определенный элемент переключателя моего HTML.Я хотел бы улучшить мой локатор, чтобы он был более динамичным, используя хранимую переменную для представления текста, для которого мой 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.Я использую Selenium IDE в Firefox.Пример моих команд содержит комментарии.

Пример 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 ]

4 голосов
/ 11 сентября 2012

Вам нужны кавычки вокруг переменной.

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

И да, я успешно использовал локатор XPath с сохраненными переменными, хотя это было не с «щелчком», а с «waitForXpathCount».Сначала это не сработало, и мне пришлось прибегнуть к отладке printf, чтобы найти причину.Причина, по которой это не сработало, здесь неактуальна (я не поставил цель должным образом) , но я думаю, что список соответствующих файлов будет интересен тем, у кого проблемы с Selenium IDE.

Расположение файлов на Mac:

~ / Библиотека / Поддержка приложений / Firefox / Профили / [ваш профиль] / extensions / {a6fd85ed-e919-4a43-a5af-8da18bda539f} /chrome / content / selenium-core / scripts /

Важные файлы:

  • selenium-api.js
    Основные обработчики команд.ех.Selenium.prototype.doClick
  • selenium-browserbot.js
    Отвечает за взаимодействие с браузером.Обработчик doClick, приведенный выше, вызывает, например, BrowserBot.prototype.findElement.
  • selenium-executeloop.js
    Вызывает обработчики команд.Наиболее важным в этом случае является предварительная обработка строки локатора с помощью selenium.preprocessParameter(command.target).selenium.preprocessParameter можно найти в selenium-api.js.
  • htmlutils.js
    Предоставляет XPathEvaluator

Как печатать в журнал IDE:

LOG.error("Useful debugging information");

Вам необходимо перезапускать Firefox каждый раз, когда вы вносите изменения во внутреннюю среду Selenium IDE (я не смог найти способ перезагрузить его на лету).проверьте выражение XPath, как $x("xpath/expr/with/stored/variables/replaced/accordingly"), на обычной консоли Firefox JS.

0 голосов
/ 29 апреля 2011

Да, это должно работать просто отлично. Документация показывает простой пример:

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

Очевидный вопрос: «Откуда вы взяли значение radioText?», За которым следует «Вы уверены, что в нем нет другого текста?» (потому что вы закодировали "text()='xxx'", а не "contains(text(), '...')". Или, возможно, вы действительно пропустили кавычки в коде, а не только в своем примере ( т.е. , "text()=xxx" не "text()='xxx'")?

0 голосов
/ 29 апреля 2011

Какой элемент HTML вы выбираете? Можете ли вы предоставить HTML? Да, это возможно Какую привязку вы используете? то есть. Python, Ruby, Java ???

Вы можете сделать что-то вроде этого:

var = selenium.get_eval(locator)
...