2017-11-27 11 views
1

このページにアクセスするにはchrome:// downloads /にアクセスして、ファイルがダウンロードされていることを確認してください。ただし、それはShadow DOMです。Watirを使ってShadow DOMにアクセスして対話する方法は?

この記事では、Selenium Webdriverを使用してDOM要素にアクセスする方法について説明しました。

execute_script("return $('<#file-link>')") 

    execute_script("return $('<:contains(test-file.mp3)>')") 
http://jeremysklarsky.github.io/blog/2015/06/13/accessing-shadow-dom-elements-with-selenium-webdriver/

しかし、これはJS

driver.executeScript("return $('body /deep/ <#yourSelector>')") 
 

 
driver.executeScript("return $('body /deep/ ._mm_column')[0].textContent").then(function(title){ 
 
    title.should.contain(segmentName); 
 
});

で書かれているがワチール構文に、私のコードは動作しますがが、望ましい結果を私に返していないことを変えました

私はコンソールでnilsを取得しています。

enter image description here

しかし、私は取得したいのですが、要素が存在することを確認することです。

+0

すべてはjavascriptのになるだろう、あなたは何でも実行するためにブラウザを求めているようRuby、Java、JSのいずれかの言語を呼び出しているかどうかは関係ありません。この例に従うとしたら、あなたの例にある 'body/deep /'部分を含める必要があります。コード。 –

答えて

0

titusfortnerの削除された答えに記載されているように、Selenium Easyに関連記事「Working with Shadow DOM Elements using Webdriver」がありました。 JavaScriptを使用してシャドー要素を取得し、次にその子孫と通常どおりにやりとりすることができます。

しかし、Watirが書かれているため、私はmonkey-patch Watir::Browserを動作させる必要がありました。私は、より恒久的な修正を得ることができるかどうか、今のところ、ここで働い例ですよ:execute_scriptの引数として与えられた

require 'watir' 

# Monkey-patch due to being unable to check the tag name of the shadow root 
class Watir::Browser 
    def wrap_element(scope, element) 
    Watir.element_class_for(element.tag_name.downcase).new(scope, element: element) 
    rescue Selenium::WebDriver::Error::UnknownError # need a better rescue 
    Watir::Element.new(scope, element: element) 
    end 
end 

def expand_root_element(element, browser) 
    browser.execute_script("return arguments[0].shadowRoot", element) 
end 

browser = Watir::Browser.new 

# Create a download item 
browser.goto('https://chromedriver.storage.googleapis.com/2.33/chromedriver_win32.zip') 
browser.goto('chrome://downloads') 

# Navigate the shadow DOM to the download items 
download_manager = browser.element(css: 'downloads-manager') 
shadow_download_manager = expand_root_element(download_manager, browser) 

download_items = shadow_download_manager.elements(css: '#downloads-list downloads-item') 
shadow_download_items = download_items.map { |s| expand_root_element(s, browser) } 

# Find a specific download item by file name 
expected_file = /chromedriver_win32/ 
download = shadow_download_items.find { |s| s.span(id: 'name').text_content =~ expected_file } 

# Do something with the download - eg wait for the download to complete 
download.link(id: 'show').wait_until_present 
関連する問題