2017-01-12 2 views
2

Как я могу использовать selenium webdriver, чтобы получить все ссылки со страницы, на которых есть свойство a[href*=/simulation/form/], а затем открыть и закрыть каждый из них?Как использовать selenium webdriver для ссылки на ссылки

Я пробовал следующий код, но он возвращает TypeError: link.click is not a function

var simLinks = driver.findElements(By.css('a[href*=/simulation/form/]')); 

for(var link in simLinks){ 
    link.click(); 
    driver.wait(30000); 
    driver.back(); 
} 

Если я console.log(simLinks.length) возвращает undefined

Вместо этого, он работает идеально, если я пытаюсь открыть одну ссылку этого типа:

var simLinks = driver.findElement(By.css('a[href*=/simulation/form/]')).click(); 
+0

Какой тип simLinks? – sachsure

+0

simLinks должен содержать все элементы с свойством '' a [href * =/simulation/form /] '... – Valip

+0

Я вижу, что в Java это будет сделано как« Список simLinks = driver.findElements (By.css (' a [href * =/simulation/form /] ')); ', но я использую javascript. – Valip

ответ

2

Используйте функцию util.inspect() для проверки объектов:

const util = require('util'); 
... 
console.log(util.inspect(simLinks)); 

После того, как вы сделаете это, вы увидите, что simLinks является ManagedPromise, так что вы должны изменить код следующим образом, чтобы сделать его работу:

driver.findElements(By.css('a[href*="/simulation/form/"]')).then(function (simLinks) { 
    for (let link of simLinks) { 
    link.click(); 
    driver.wait(until.urlContains('/simulation/form/', 30000)); 
    driver.navigate().back(); 
    } 
}); 

Проблема заключается в том, что работает только первый клик, но после того, как вы вернетесь назад, существует законный StaleElementReferenceError - страница действительно изменилась, и следующий элемент в цикле не будет ger, прикрепленный к видимой странице. Поэтому лучшей стратегией было бы собирать адреса ссылок вместо этого и использовать их с driver.navigate().to(link):

driver.findElements(By.css('a[href*="/simulation/form/"]')).then(function (simLinks) { 
    var hrefs = simLinks.map(link => link.getAttribute('href')); 
    for (let link of hrefs) { 
    driver.navigate().to(link); 
    driver.wait(until.urlContains('/simulation/form/', 30000)); 
    driver.navigate().back(); 
    } 
}); 
+0

У меня все еще есть эта ошибка 'TypeError: link.click не является функцией', но хорошо, что консоль возвращает 2 объекта' WebElement', которые являются моими ссылками – Valip

+0

Ах, действительно, 'simLinks' - это массив. Я исправил ответ соответственно, теперь должен работать :). –

+0

Спасибо, это должно сделать это, но теперь он выдает «ElementNotVisibleError». Как получается, что элемент не отображается, поскольку он регистрируется в консоли? – Valip

0

Я считаю, что вы должны использовать:

console.log (simLinks.size())

Я не знаю, требуется ли() в javascript - это в java.

+0

Я использую 'javascript', а не' java' – Valip

Смежные вопросы