2017-01-19 11 views
0

Я хочу, чтобы текст «HEATMAPS» был нажат после открытия веб-страницы. Я пробовал количество кликов, включая распознавание как гиперссылку, как текст, как использование xpath и т. Д. Ни один из них не работал. Я чувствую, что я либо неправильно понимаю ссылки, либо гиперссылку, либо выбор неправильного xpath.Как выбрать встроенный элемент с использованием watir в ruby ​​

Link of the web page

PFB код ниже

require 'watir-webdriver' 
require 'watir-ng' 
WatirNg.patch! 
WatirNg.register(:ng_scope).patch! 
browser = Watir::Browser.new 
browser.goto 'http://app.vwo.com/#/campaign/108/summary? token=eyJhY2NvdW50X2lkIjoxNTA3MzQsImV4cGVyaW1lbnRfaWQiOjEwOCwiY3JlYXRlZF9vbiI6MTQ0NDgxMjQ4MSwidHlwZSI6ImNhbXBhaWduIiwidmVyc2lvbiI6MSwiaGFzaCI6IjJmZjk3OTVjZTgwNmFmZjJiOTI5NDczMTc5YTBlODQxIn0=' 

lin = browser.link :text=> 'HEATMAPS' 
lin.exist? 
lin.click 

Может кто-то пожалуйста, руководство меня на это, так как, как я могу сделать эту ссылку с текстом «тепловые карты» на странице клика.

Я получаю ошибку:

`This code has slept for the duration of the default timeout waiting for an Element to exist. If the test is still passing, consider using Element#exists? instead of rescuing UnknownObjectException 
C:/Ruby22/lib/ruby/gems/2.2.0/gems/watir-6.1.0/lib/watir/elements/element.rb:507:in `rescue in wait_for_exists': timed out after 30 seconds, waiting for {:text=>"HEATMAPS", :tag_name=>"a"} to be located (Watir::Exception::UnknownObjectException) 
     from C:/Ruby22/lib/ruby/gems/2.2.0/gems/watir-6.1.0/lib/watir/elements/element.rb:497:in `wait_for_exists' 
     from C:/Ruby22/lib/ruby/gems/2.2.0/gems/watir-6.1.0/lib/watir/elements/element.rb:515:in `wait_for_present' 
     from C:/Ruby22/lib/ruby/gems/2.2.0/gems/watir-6.1.0/lib/watir/elements/element.rb:533:in `wait_for_enabled' 
     from C:/Ruby22/lib/ruby/gems/2.2.0/gems/watir-6.1.0/lib/watir/elements/element.rb:656:in `element_call' 
     from C:/Ruby22/lib/ruby/gems/2.2.0/gems/watir-6.1.0/lib/watir/elements/element.rb:114:in `click' 
     from C:/Users/Mrityunjeyan/Documents/GitHub/Simpleprograms/webautomation.rb:10:in `<main>'` 

Это выведет меня inner_html текст, но все еще Wouldnt нажмите

lin = browser.span(:class => 'ng-scope').inner_html puts lin

+0

Я попытался identitifying элемент, используя '' inner_html' и innertext' тоже, но по-прежнему не работает, что будет отображать 'nomethoderror' –

ответ

3

Проблема в том, что текст ссылки не является «HEATMAPS». Это на самом деле «Heatmaps». Текст локатор чувствителен к регистру, а это означает, что вам нужно:

lin = browser.link :text=> 'Heatmaps' 

Вы можете увидеть это, если вы осмотрите HTML:

<a ui-sref="campaign.heatmap-clickmap" href="#/analyze/analysis/108/heatmaps?token=eyJhY2NvdW50X2lkIjoxNTA3MzQsImV4cGVyaW1lbnRfaWQiOjEwOCwiY3JlYXRlZF9vbiI6MTQ0NDgxMjQ4MSwidHlwZSI6ImNhbXBhaWduIiwidmVyc2lvbiI6MSwiaGFzaCI6IjJmZjk3OTVjZTgwNmFmZjJiOTI5NDczMTc5YTBlODQxIn0%3D"> 
    <!-- boIf: isAnalyticsCampaign --> 
    <span bo-if="isAnalyticsCampaign" class="ng-scope">Heatmaps</span> 
    <!-- boIf: !isAnalyticsCampaign --> 
</a> 

Это выглядит только как «тепловые карты» в связи с моделированием. Один из стилей включает text-transform: uppercase;, который визуально использует текст. Watir не интерпретирует стили, поэтому только знает, что текстовым узлом является «Heatmaps».

После того, как вы определили ссылку, нажав еще есть проблема:

lin.click 
#=> Selenium::WebDriver::Error::UnknownError: 
#=> unknown error: Element <a ui-sref="analyze.heatmaps" ng-class="{selected: (locationContains('analyze', 'heatmap') &amp;&amp; !locationContains('analyze', '/analysis') &amp;&amp; state.current.name !== 'campaign.heatmap-clickmap') || (isAnalyzeHeatmapEnabled &amp;&amp; (isAnalyzeDeprecatedHeatmapView || locationContains('analyze', '/analysis', 'heatmaps')))}" data-qa="nav-main-analyze-heatmap" href="#/analyze/heatmap">...</a> 
#=> is not clickable at point (90, 121). 
#=> Other element would receive the click: <div ng-show="!isCROSetupView" class="">...</div> 

Ссылка расположены на самом деле один в левом меню, который отключается, а не в верхнем меню. Вам нужно развернуть локатор ссылок только в верхнем меню. Используя элемент родительского ul оказывается достаточным:

lin = browser.ul(class: 'page-nav').link(text: 'Heatmaps') 
lin.click 

Чтобы увидеть click завершена, вы можете сказать, Chrome, чтобы не закрывать в конце сценария. Это делается путем открытия браузера, используя следующий вариант:

caps = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => {'detach' => true}) 
browser = Watir::Browser.new :chrome, desired_capabilities: caps 
+0

Спасибо! Сейчас есть прогресс, я использовал одну и ту же команду, но с классом 'ng-scope', поскольку он был вложен в' li'. В настоящее время я нахожу, что хром запускает страницу и закрывает страницу, не давая мне никаких ошибок или результатов, и ни один из них не появляется. –

+0

Я даже попытался с помощью 'лин = browser.ul (класс: 'Страница-Nav') ссылка (текст: 'Схемы Зоны активности').' ' lin.exist' ' lin.click' Любая идея, почему? –

+1

Возможно, вы захотите быть осторожным в классе 'ng-scope'. Это довольно общее и не делает очевидным то, что вы находите. Похоже, что код работает, однако из-за асинхронного поведения Chrome движется до загрузки новой страницы. По умолчанию Chrome закрывается в конце скрипта. Поэтому, если у вас есть другой код, вы не увидите загрузку страницы. Для debuggin вы должны сообщить Chrome о прекращении закрытия в конце (см. Обновление). –

1

Ваша целевая ссылка не имеет какой-либо текст . Я подтвердил с nokogiri, что текст тега <a> содержит текст внутри дочернего тега <span>, и, оказывается, Watir работает одинаково.

Если вы используете браузер Chrome, вы можете выбрать:

View > Developer > Developer tools 

Затем вы можете выбрать элемент на странице, и соответствующий раздел в HTML будет выделен. Вот что HTML выглядит следующим образом:

<a ui-sref="campaign.heatmap-clickmap" 
    href="#/analyze/analysis/108/heatmaps?token=eyJhY2NvdW50X2lkIjoxNTA3MzQsImV4cGVyaW1lbnRfaWQiOjEwOCwiY3JlYXRlZF9vbiI6MTQ0NDgxMjQ4MSwidHlwZSI6ImNhbXBhaWduIiwidmVyc2lvbiI6MSwiaGFzaCI6IjJmZjk3OTVjZTgwNmFmZjJiOTI5NDczMTc5YTBlODQxIn0%3D"> 
<!-- boIf: isAnalyticsCampaign --> 

<span bo-if="isAnalyticsCampaign" class="ng-scope">Heatmaps</span> 

<!-- boIf: !isAnalyticsCampaign --> </a> 

Основная структура:

<a><span>Heatmaps</span></a> 

Chrome даже имеет функцию, где вы можете правой кнопкой мыши на элементе и получить его XPath, которые вы можете использовать с Watir.

Однако, когда я запускаю свою программу для перехода на эту страницу, я вижу запуск Chrome, а затем мне предоставляется страница входа в систему, а не страница, которая была представлена ​​мне по вашей ссылке.

Arghhh ... какая колоссальная трата времени. Я думал, что Ватир должен быть сломан. При правильном URL, я могу получить ссылку с помощью нескольких различных методов:

1)

require 'watir' 
require 'watir-ng' #<=NOTE THIS 

WatirNg.register(:'bo_if').patch! #<= NOTE THIS 

br = Watir::Browser.new :chrome 
br.goto 'http://app.vwo.com/#/analyze/analysis/108/summary?token=eyJhY2NvdW50X2lkIjoxNTA3MzQsImV4cGVyaW1lbnRfaWQiOjEwOCwiY3JlYXRlZF9vbiI6MTQ0NDgxMjQ4MSwidHlwZSI6ImNhbXBhaWduIiwidmVyc2lvbiI6MSwiaGFzaCI6IjJmZjk3OTVjZTgwNmFmZjJiOTI5NDczMTc5YTBlODQxIn0%3D' 

target_link = br.span(
    class: 'ng-scope', 
    'bo_if': 'isAnalyticsCampaign', 
).parent #<= NOTE THIS 

puts target_link.text #HEATMAPS 
puts target_link.href #http://app.vwo.com/#/analyze/analysis/1..... 

2)

require 'watir' 
require 'watir-ng' #<=NOTE THIS 

WatirNg.register(:ui_sref).patch! #<=NOTE THIS 

br = Watir::Browser.new :chrome 
br.goto 'http://app.vwo.com/#/analyze/analysis/108/summary?token=eyJhY2NvdW50X2lkIjoxNTA3MzQsImV4cGVyaW1lbnRfaWQiOjEwOCwiY3JlYXRlZF9vbiI6MTQ0NDgxMjQ4MSwidHlwZSI6ImNhbXBhaWduIiwidmVyc2lvbiI6MSwiaGFzaCI6IjJmZjk3OTVjZTgwNmFmZjJiOTI5NDczMTc5YTBlODQxIn0%3D' 

target_link = br.link(
    ui_sref: 'campaign.heatmap-clickmap', 
    href: '#/analyze/analysis/108/heatmaps?token=eyJhY2NvdW50X2lkIjoxNTA3MzQsImV4cGVyaW1lbnRfaWQiOjEwOCwiY3JlYXRlZF9vbiI6MTQ0NDgxMjQ4MSwidHlwZSI6ImNhbXBhaWduIiwidmVyc2lvbiI6MSwiaGFzaCI6IjJmZjk3OTVjZTgwNmFmZjJiOTI5NDczMTc5YTBlODQxIn0%3D' 
) 

puts target_link.text #HEATMAPS 
puts target_link.href #http://app.vwo.com/#/analyze/analysis/108... 

3) Получение XPath, щелкнув правой кнопкой мыши по ссылке в Chrome :

require 'watir' 

br = Watir::Browser.new :chrome 
br.goto 'http://app.vwo.com/#/analyze/analysis/108/summary?token=eyJhY2NvdW50X2lkIjoxNTA3MzQsImV4cGVyaW1lbnRfaWQiOjEwOCwiY3JlYXRlZF9vbiI6MTQ0NDgxMjQ4MSwidHlwZSI6ImNhbXBhaWduIiwidmVyc2lvbiI6MSwiaGFzaCI6IjJmZjk3OTVjZTgwNmFmZjJiOTI5NDczMTc5YTBlODQxIn0%3D' 

target_link = br.link(
    xpath: '//*[@id="main-container"]/ul/li[3]/a' 
) 
puts target_link.text #HEATMAPS 
puts target_link.href #http://app.vwo.com/#/analyze/analysis/108.... 

xpath может обрабатывать любые теги или атрибуты, в отличие от Watir, поэтому он кажется хорошим инструментом в это отношение.

4) Менее хрупкий XPath:

require 'watir' 

br = Watir::Browser.new :chrome 
br.goto 'http://app.vwo.com/#/analyze/analysis/108/summary?token=eyJhY2NvdW50X2lkIjoxNTA3MzQsImV4cGVyaW1lbnRfaWQiOjEwOCwiY3JlYXRlZF9vbiI6MTQ0NDgxMjQ4MSwidHlwZSI6ImNhbXBhaWduIiwidmVyc2lvbiI6MSwiaGFzaCI6IjJmZjk3OTVjZTgwNmFmZjJiOTI5NDczMTc5YTBlODQxIn0%3D' 


a_href = "#/analyze/analysis/108/heatmaps?token=eyJhY2NvdW50X2lkIjoxNTA3MzQsImV4cGVyaW1lbnRfaWQiOjEwOCwiY3JlYXRlZF9vbiI6MTQ0NDgxMjQ4MSwidHlwZSI6ImNhbXBhaWduIiwidmVyc2lvbiI6MSwiaGFzaCI6IjJmZjk3OTVjZTgwNmFmZjJiOTI5NDczMTc5YTBlODQxIn0%3D" 

target_link = br.link(
    xpath: %Q{ //a[@href="#{a_href}"] } + 
       '[@ui-sref="campaign.heatmap-clickmap"]' + 
       '[child::span[@class="ng-scope"][@bo-if="isAnalyticsCampaign"][text()="Heatmaps"]]' 
) 

XPath ищет <a> тега с двумя атрибутами:

//a[@href="blah"][@ui-sref="bleh"] 

, которая имеет ребенка <span> (т.е. прямой ребенок) с тремя атрибутами :

[child::span[@class="blih"][@bo-if="bloh"][text()="Heatmaps"]] 

После того как я программно cl ick link:

target_link.click 

Watir переходит на следующую страницу.

+0

Спасибо за Ответить. Я получаю это, структуру, но мой вопрос был в том, что такое 'имя элемента 'или' имя класса', больным приходится указывать этот элемент в моем ruby-коде? У меня уже есть html и структура через инструменты разработчика, проверьте опцию. Однако, когда вы нажимаете на copy xpath, я понимаю, что это '// * [@ id =" main-container "]/ul/li [3]/a/span' Не знаете, почему вы дали страницу входа в систему, поскольку, когда я выполняю тот же код, который я упоминал в вопросе, каждый раз он открывает панель. –

+0

Страница входа в систему появляется из-за пробела в URL-адресе (для примера кода). Если вы выберете место, он будет перемещаться так, как ожидалось. –

+0

Хорошо! Но все же я нахожу код, не нажимая на элемент, я указываю. Вы могли это сделать? –