2017-10-17 10 views
2

PythonとSeleniumを使ったテストの一環として、私はセレンを使ってYouTubeリンクを開き、 "AirPlay"ボタンを順番にクリックしたいと考えていますそれをApple TVに送信します。 最初は、要素が隠されているという問題がありましたが、それはActionChainsを使って世話されました。スクリプトは実行されますが、AppleTvの名前が表示されているビデオで再生されているクリックは表示されません。セレンのwebdriverを使ってSafari(mac)の隠れたAirPlayボタン要素をクリックできません

from selenium import webdriver 
from selenium.common.exceptions import NoSuchElementException 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.common.by import By 
from selenium.webdriver import ActionChains 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
import os , sys 

server_url = "http://10.0.10.4:4444/wd/hub" 
capabilities = DesiredCapabilities.SAFARI 
driver = webdriver.Remote(desired_capabilities=capabilities, 
command_executor=server_url) 
driver.get("https://www.youtube.com/watch?v=_YhrCp9m14k") 

#air_play = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//*[@id="move_player"]/div[28]/div[2]/div[2]/button[6]'))) 
air_play = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CLASS_NAME, 'ytp-airplay-button'))) 
#air_play = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//*[@id="text"]'))) 

#air_play = driver.find_element_by_css_selector('button.ytp-ariplay-button') 
hover = ActionChains(driver).move_to_element(air_play) 
hover.perform() 

hover1 = ActionChains(driver).click_and_hold(air_play).perform() 

次のようにHTML要素がある:

<button class="ytp-airplay-button ytp-button" title="AirPlay" style=""><svg 
height="100%" version="1.1" viewBox="0 0 36 36" width="100%"><use 
class="ytp-svg-shadow" NS1:href="#ytp-id-27"></use><path class="ytp-svg- 
fill" d="M12,28 L24,28 L18,22 L12,28 Z M27,9 L9,9 C7.9,9 7,9.9 7,11 L7,23 
C7,24.1 7.9,25 9,25 L13,25 L13,23 L9,23 L9,11 L27,11 L27,23 L23,23 L23,25 
L27,25 C28.1,25 29,24.1 29,23 L29,11 C29,9.9 28.1,9 27,9 L27,9 Z" id="ytp- 
id-27"></path></svg></ button> 

次のようにXPATHである:

//*[@id="movie_player"]/div[28]/div[2]/div[2]/button[6] 

次のようにCSSセレクタがある:以下

コードであります

#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp- 
right- controls > button.ytp-airplay-button.ytp-button 

ボタンがクリックされず、利用可能なAirplayオプションが表示される理由についてお手伝いできますか?

ビデオの上に移動する前に。ビデオの上にホバリングとのAirPlayボタンをクリックした後

Before hovering over the video

After hovering over the video and clicking on the AirPlay button

+0

私はAirplayのオプションが表示されません。私はそれが表示されるようにトリガするいくつかのコンポーネントが不足していると仮定しています。あなたの質問を編集し、関連するHTMLを投稿できますか? – JeffC

+0

@ JeffC。私はあなたが必要とする必要な情報を提供したことを願っています。たぶん私は、この要素は、Macの本のSafariブラウザに表示されることを言及する必要があります。私はSafariブラウザをインストールしたWindowsで試したことがありません。 –

答えて

1

私はので、私はこれを自分でREPROすることはできませんMac上のSafariを持っていないが、私は(あなたのスクリーンショットから)問題を推測しているアイコンは、ビデオ領域まで表示されていないということです吊るされている。設計上、Seleniumはユーザーが見ることができない要素と対話しません。これを行うにはいくつかの方法があります。

  1. ユーザーの方法...ビデオをホバーし、アイコンをホバーし、アイコンをクリックします。ユーザーをシミュレートする場合は、これを使用する方法です。

    from selenium import webdriver 
    from selenium.webdriver.common.action_chains import ActionChains 
    from selenium.webdriver.support import expected_conditions as EC 
    
    video = driver.find_element_by_css_selector("video") 
    ActionChains(driver).move_to_element(video).perform() 
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[title='AirPlay']")).click() 
    
  2. JSEで非ユーザの方法をクリックしてください。 JSEでは、可視かどうかに関わらず任意の要素をクリックできます。ユーザーは目に見えない要素をクリックすることはできません。そのため、ユーザーをシミュレートしようとしている場合は、この#1を使用しないでください。

    airplayButton = driver.find_element_by_css_selector("button[title='AirPlay']") 
    driver.execute_script("arguments[0].click();", airplayButton); 
    
+0

私は両方のステップを試しました。 2番目のステップは機能しているようです。私は利用可能なairplayデバイスが表示されたポップアップを見ることができます。ユーザーの作業を効率化するためにこれに少し時間を費やします。それ以上のアイデアは本当に便利です。また、2番目のステップの修正は "driver.execute_script(....)"になります。 –

+0

最初のステップでは、ホバーとクリックの間に待機が必要な可能性があります。答えを更新し、あなたの修正を訂正しました...私の頭の中にあまりにも多くの言語...良いキャッチ。;) – JeffC

+0

私はWebDriverWaitを使って最初のステップを試みましたが、興味深いことに、要素をクリック可能にするのを待ってTimeoutExceptionが発生しました。ページをチェックすると、ボタンが表示される前に "title = AirPlay"がHTMLに表示されますが、AirPlayボタンの上にマウスを置くとtitle = Airplayがなくなります。スナップショットも添付しました。 TimeoutException(message、screen、stacktrace)selenium.common.exceptionsを呼び出すまで、ファイル "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/s upport/wait.py"、80行目。 TimeoutException:メッセージ。 –

関連する問題