@FindAll работает медленно при попытке найти несколько элементов

У меня есть локализованная страница, а веб-элемент «Создать учетную запись» может быть на английском, китайском или японском языках. Я использую платформу Selenium, Java и TestNG для запуска теста, чтобы щелкнуть этот элемент. Однако низкая производительность при использовании этого @FindAll для идентификации страницы заставляет меня задаться вопросом, есть ли лучший способ сделать это.

Элемент из Inspect element, когда выбрана локаль "English":

<div class="form-group">
        <a translate="create-account" class="pointer ng-scope" ng-click="vm.createAccount()">Create Account</a>
    </div>

Моя декларация FindAll:

@FindAll({
    @FindBy(linkText="Create Account"),
    @FindBy(linkText="创建账号"),
    @FindBy(linkText="アカウントを作成")
})
private List<WebElement> createAccount;

В качестве основы для сравнения, если я использую @FindAll выше, требуется около 15 секунд, прежде чем Webdriver щелкнет ссылку. Если я использую только @FindBy, это занимает около 2-3 секунд. Однако @FindBy у меня не работает, так как мне нужно найти правильную локаль, чтобы щелкнуть ссылку.


person Yik Ran Au Yong    schedule 20.09.2016    source источник


Ответы (2)


Вы можете использовать один селектор CSS, например:
a[ng-click*='createAccount']

Или один из xpaths:

//a[contains(@ng-click, 'createAccount')]
//a[contains(text(), 'Create Account') or contains(text(), '创建账号') or contains(text(), 'アカウントを作成')]

Для css, если вы передаете часть значения атрибута, оно должно быть [@attributeName*='part_of_attribute_value']
Посмотрите здесь, чтобы просмотреть базовый список правил css CSS-селекторы w3schools

person lauda    schedule 20.09.2016
comment
Мне нравится независимый от языка подход первого. Последний начинает становиться громоздким и будет только ухудшаться по мере добавления новых языков. - person JeffC; 21.09.2016
comment
Да, это хороший подход, при использовании текстов единственным преимуществом является то, что вы также тестируете перевод, но при этом стабильность и небольшие затраты на производительность. Вы можете принять ответ, если все в порядке. - person lauda; 21.09.2016
comment
Спасибо @лауда. Я попробовал ваш селектор css, но почему-то он все еще не работал. Однако ваш ответ дал мне другую идею, поэтому я попробовал code @FindBy (css=a.pointer.ng-scope) private WebElement CreateAccount; и это сработало для меня. Мне интересно, почему code @FindBy (css=a[ng-click='createAccount']) private WebElement CreateAccount; не сработало. - person Yik Ran Au Yong; 21.09.2016
comment
Это не сработало, потому что частично неверно. Это должно быть [ng-click*='createAccount'] - person lauda; 21.09.2016

Спасибо @lauda за помощь и ссылку на селекторы w3 css. На самом деле я нашел еще два способа определить эту ссылку с помощью css:

@FindBy(css="a[translate='create-account']")
private WebElement CreateAccount;

а также

@FindBy (css="a.pointer.ng-scope")
private WebElement CreateAccount;

Однако не уверен, почему оригинальное решение, опубликованное Лаудой, не сработало для меня.

a[ng-click*='createAccount']
person Yik Ran Au Yong    schedule 22.09.2016