2017-06-16 6 views
1

次のページを実行するためにセレンを使用する方法を理解しようとしています。ニュースリリースページをクリックしてください。正しいウェブサイトに行き、適切なニュースリリース記事のトピックページを入手するための検索を実行するコードです。このサイトは、検索が実行された後の1ページ目のすべてのニュースリリースを表示するように設定されているため、ページ下部の[その他のニュース結果]ボタンも選択する必要があります。私は問題なしで全面的な1ページのニュースセクションに入ることができます。ここでは、検索とページのクリックを実行する私のコードです。コードの一部が正常に動作しますが、私はそうで2ページに移動し、[次へ]ボタンをクリックし、ページ3とすることができるようにしたいということElementNotVisibleException次ページのボタンのPython/Seleniumエラー

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 

browser = webdriver.Chrome() 
browser.get('http://www.businesswire.com/portal/site/home/') 
search_box_element = browser.find_element_by_id('bw-search-input') 
search_box_element.clear() 
search_box_element.send_keys('biotechnology') 
search_box_element.send_keys(Keys.ENTER) 
search_box_element_two = browser.find_element_by_id('more-news-results') 
search_box_element_two.click() 

。ここで私は仕事だろうと思ったのコードがあるが、それはしません。

next_page_click_element = browser.find_element_by_class_name("bw-paging-next") 
next_page_click_element.click() 

コードのこの部分は、エラーがスローされます。

selenium.common.exceptions.ElementNotVisibleException: Message: 
element not visible 

私も

next_page_click_element = browser.find_element_by_xpath('//*[@id="more-news-pagination"]/div/div[1]/div/a') 

を使用して試してみました同じエラーメッセージが表示されます。私はまた、next_page_click_elementセクションの直前にこれらのコード行を追加して待機を試みました。

element_present = EC.presence_of_element_located((By.ID, "bw-paging-next")) 
WebDriverWait(browser, 10).until(element_present) 

これはそれを待つためのプログラムは、このエラーメッセージを返す原因んが:

raise TimeoutException(message, screen, stacktrace) 
selenium.common.exceptions.TimeoutException: Message: 

をこの問題を解決する方法上の任意の提案をいただければ幸いです。ここで

+0

'(By.ID、" bw-paging-next ")'を '(By.CLASS_NAME、" bw-paging-next ")に置き換えてください。 – Andersson

+0

こんにちは、ありがとうございます。残念ながらそれは動作しません。 By.IDをBy.CLASS_NAMEに置き換えると、元の要素が表示されないエラーメッセージが返されます。この変更により、待機時間は発生しません。 – user3798654

+0

クリックする前に 'next_page_click_element.location_once_scrolled_into_view'を実行してみてください。 – Andersson

答えて

1

は、あなたの質問への答えです:

Page 2Page 3Nextなどの要素は、ページの下部にあるとして溶液 -

  1. に関するいくつかの単語は、あなたがスクロールする必要がありこれらの要素をViewport内に持ち込むことができます。
  2. スクロールしたら、要素がHTML DOM上に正しく配置されるように、ExplicitWaitを誘発することを検討することがあります。

    from selenium import webdriver 
    from selenium.webdriver.common.keys import Keys 
    from selenium.webdriver.support.ui import WebDriverWait 
    from selenium.webdriver.support import expected_conditions as EC 
    from selenium.webdriver.common.by import By 
    
    browser=webdriver.Chrome("C:\\Utility\\BrowserDrivers\\chromedriver.exe") 
    browser.get('http://www.businesswire.com/portal/site/home/') 
    search_box_element = browser.find_element_by_id('bw-search-input') 
    search_box_element.clear() 
    search_box_element.send_keys('biotechnology') 
    search_box_element.send_keys(Keys.ENTER) 
    search_box_element_two = browser.find_element_by_id('more-news-results') 
    search_box_element_two.click() 
    last_height = browser.execute_script("return document.body.scrollHeight") 
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    next_page_click_element = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//div[@id='more-news-pagination']/div/div/div/a[text()='Next']")) 
    ) 
    next_page_click_element.click() 
    

これは、あなたの質問に答えるならば、私に教えてください:ここで

  • は、最終的にはページの一番下までスクロールし、Nextリンクをクリックしますいくつかの簡単な心痛を使用して独自のコードがあります。

  • +0

    'ExplicitWait'の直前で' time.sleep() 'を使うのはなぜですか? :) – Andersson

    +0

    DebanjanB、ありがとうございます。ソリューションが機能しました。ほんとうにありがとう。George – user3798654

    +0

    Andersson、あなたは正しい道にいると思う。ご協力ありがとうございました。 – user3798654

    関連する問題