2016-04-06 23 views
1

このsiteのカレンダーエントリをPythonでセレンを使用してクリックしたいと思います。私は明らかに各カレンダーのエントリを見ることができますが、私はそのxpath、idなどを取得することができますが、私は要素を見つけるしようとすると、私はエラーを取得します。 (例えば、I 4月の20日目のリンクは、ID =「20160420」を有することがわかります)Pythonセレンで可視要素を見つけることができません

browser = webdriver.Firefox(firefox_profile=fp) 
browser.get(url) 
browser.implicitly_wait(5) 
el=browser.find_element_by_id('20160420') 

(私は無駄ではなくフレーム、能動素子等の切り替えを試みた任意の提案遠く...)

+0

iframeを正しく交換してもよろしいですか? – Zhack

+0

私は確信していません。私はコードで2つのフレームを見て、両方に切り替えようとしました。すべてのフレームをリストする方法はありますか? – gpanterov

答えて

2

あなたのコードはまだiframeに切り替えられていません。

browser = webdriver.Firefox(firefox_profile=fp) 
browser.get(url) 
browser.implicitly_wait(5) 
time.sleep(5) 
iframe = browser.find_element_by_css_selector('#crowdTorchTicketingMainContainer > iframe') 
browser.switch_to.frame(iframe) 
el=browser.find_element_by_id('20160420') 
print(el.text) 
+0

これはそれでした!ありがとう!クイックフォローアップ - どのように正しいフレームのCSSセレクターを見つけましたか?私は生のページソースでこのフレームを検索しようとしましたが、何も出てこなかった – gpanterov

+0

Chrome Dev'Toolを使用して要素の階層を見ることができます。この記事の私の答えを見てください:http://stackoverflow.com/questions/35194819/unable-to-access-login-container-elements-in-chrome/35196463?noredirect=1#comment58112245_35196463 Cssセレクタの式に関しては、自分で作成しました。いくつかの興味深い例がhttps://saucelabs.com/resources/selenium/css-selectorsからご覧になれます。 – Buaban

0

問題は、あなたが探している要素がiframe内にあることのようだ、とあなたはカレンダーの要素にアクセスする前に、それに切り替えることがあります:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait as WDW 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import NoSuchElementException,  TimeoutException, StaleElementReferenceException 


url = 'https://hornblowernewyork.com/cruises/international-sightseeing-cruise' 
browser = webdriver.Firefox() 
browser.get(url) 

# seach for the appropriate iframe 
frame = browser.find_element(By.CSS_SELECTOR, "#crowdTorchTicketingMainContainer > iframe") 
if not frame: 
    raise Exception('Frame not found') 

# once the correct iframe is found switch to it, 
# then look for your calendar element 
browser.switch_to.frame(frame) 
try: 
    el = WDW(browser, 10).until(
    EC.presence_of_element_located((By.ID, "20160406")) 
) 
except (TimeoutException, NoSuchElementException, StaleElementReferenceException), e: 
    print e 
else: 
    print el 
以下のコード例を参照してください。
+0

ifssrameを直接取得するためにCSSセレクタを使用する方が良いと思います。たとえば、frame = find_element_by_css_selector( "iframe [src * = 'ticketmob']") – Buaban

+0

@Buabanのコメントに基づいて、属性によるフィルタリングを行うグループをソートするのではなく、CSSセレクタでiframeを1つだけ検索するように変更しましたiframe内で – KrusherKailash

関連する問題