質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

2508閲覧

selenium python  ウインドウの切り替えができない。

hikaa

総合スコア19

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2018/08/14 11:53

編集2018/08/17 06:13

以下のように株価のスクレイピングを行おうとしていますが、ウインドウの切り替えがうまくいきません。なぜでしょうか?ウインドウのデータは習得できているはずなのですが・・・。

よろしくお願いします。

以下エラーコード

 oSuchWindowException Traceback (most recent call last)
<ipython-input-131-fafd9a338816> in <module>()
----> 1 sikomi1(numbers)

<ipython-input-129-96a41ed9cde1> in sikomi1(numbers)
29 while num <len(numbers): #ブラウザ更新して、初値が付いたら
30 print(wh[num])
---> 31 wd.switch_to_window(wh[num])
32 wd.refresh()
33 sine[num] = wd.find_element_by_xpath("//div[@id='detail']/div[2]/div[2]/dl/dd/strong").text

~\AppData\Roaming\Python\Python36\site-packages\selenium\webdriver\remote\webdriver.py in switch_to_window(self, window_name)
777 """
778 warnings.warn("use driver.switch_to.window instead", DeprecationWarning)
--> 779 self._switch_to.window(window_name)
780
781 def switch_to_frame(self, frame_reference):

~\AppData\Roaming\Python\Python36\site-packages\selenium\webdriver\remote\switch_to.py in window(self, window_name)
113 return
114 data = {'name': window_name}
--> 115 self._driver.execute(Command.SWITCH_TO_WINDOW, data)
116
117 def _w3c_window(self, window_name):

~\AppData\Roaming\Python\Python36\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
318 response = self.command_executor.execute(driver_command, params)
319 if response:
--> 320 self.error_handler.check_response(response)
321 response['value'] = self._unwrap_value(
322 response.get('value', None))

~\AppData\Roaming\Python\Python36\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
240 alert_text = value['alert'].get('text')
241 raise exception_class(message, screen, stacktrace, alert_text)
--> 242 raise exception_class(message, screen, stacktrace)
243
244 def _value_or_default(self, obj, key, default):

NoSuchWindowException: Message: no such window
(Session info: chrome=68.0.3440.106)
(Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 10.0.17134 x86_64)

Message: no such window

と出てしまいます。

以下ソースコード

python

1def sikomi1(numbers): 2 wh = [] #ウインドウ番号 3 sikomi1_trigger = [] 4 sine,genzai,zenjitune = [],[],[] 5 num = 0 6 wd = web.Chrome() 7 wait = wd.implicitly_wait(10) # ブラウザ起動 8 9 while num < len(numbers): #個数分、ブラウザ起動 10 wd.get("https://finance.yahoo.co.jp/") 11 wd.find_element_by_name('query').click() 12 wd.find_element_by_name("query").clear() 13 wd.find_element_by_name("query").send_keys(numbers[num]) 14 wd.find_element_by_id("searchButton").click() 15 16 sine.append(wd.find_element_by_xpath("//div[@id='detail']/div[2]/div[2]/dl/dd/strong").text) 17 zenjitune.append(wd.find_element_by_xpath("//div[@id='detail']/div[2]/div/dl/dd/strong").text) 18 num += 1 19 wh.append(wd.current_window_handle) #ウィンドウ番号の習得 20 if num == len(numbers): 21 print(wh) 22 break 23 else: 24 wd= web.Chrome() 25 26 num = 0 27 28 while num <len(numbers): #ブラウザ更新して、初値が付いたら 29 print(wh[num]) 30 **__wd.switch_to_window(wh[num])__**  ここがおかしいはずですが・・ 31 wd.refresh() 32 sine[num] = wd.find_element_by_xpath("//div[@id='detail']/div[2]/div[2]/dl/dd/strong").text 33 zenjitune[num] = wd.find_element_by_xpath("//div[@id='detail']/div[2]/div/dl/dd/strong").text 34 35 try: 36 sine[num] = int(sine[num].replace(',','')) 37 zenjitune[num] = int(zenjitune[num].replace(',','')) 38 josyo[num] = sine[num]/zenjitune[num]*100-100 39 print(josyo[num]) 40 num += 1 41 wd.switch_to_window(wh[num]) 42 43 except: 44 nun += 1 45 wd.switch_to_window(wh[num]) 46

実行結果

['CDwindow-8A8D9A9BE0F1B07B14027E7A1468EA5C', 'CDwindow-9D725EAE0F62DBD1390ACC33DB00C3D2']
CDwindow-8A8D9A9BE0F1B07B14027E7A1468EA5C

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

NoSuchWindowException: Message: no such window

グーグル翻訳
NoSuchWindowException:メッセージ:そのようなウィンドウはありません

wd= web.Chrome()

ループ内でChromeのインスタンスを上書きしていませんか。
wh = []と同様に複数保持するようにしてくださいな。


カウンタ変数を手動でインクリメント(加算)するのはバグの元なので、できるだけ避けてください。
カウンタ変数の値を正しく更新するのは、プログラマー側の責任になりそして人は容易に間違えます。
代替手段としてenumeraterangeが使えます。
参考情報:Pythonのfor文によるループ処理(range, enumerate, zipなど)
この指摘をした理由は
質問文のソースコードより抜粋しますが、以下の部分は正しく実装されていないのではと思ったからです。

Python

1num = 0 2while num <len(numbers): 3 print(wh[num]) 4 wd.switch_to_window(wh[num]) 5 wd.refresh() 6 try: 7 # 中略 8 num += 1 9 wd.switch_to_window(wh[num]) 10 except: 11 # 加算後にswitch_to_windowを行っているが、while ループの先頭でもswitch_to_windowを行っている。 12 nun += 1 13 #この位置で例外発生時にwhileループが中断される。 14 wd.switch_to_window(wh[num]) 15 # whileループにある、wd.refresh()が無いtryの中も同様

Pythonはインデントが重要な言語です。
質問文のソースコード部分を以下を参考に編集してくださいな。
コードタグの設定

wh = []
wh.append(wd.current_window_handle) #ウィンドウ番号の習得


whの複数保持の方法

質問者が該当のコードを記述しているのにその質問が来るのが少し謎ですが・・・
ウィンドウ番号を下記コードで複数保持しています。

Python

1wh = [] 2while num < len(numbers): #個数分、ブラウザ起動 3 wh.append(wd.current_window_handle) #ウィンドウ番号の習得

よって同じように

wdl = [] while num < len(numbers): #個数分、ブラウザ起動 wd = web.Chrome() # 中略 wdl.append(wd)

回答した後に気づきましたが、yahooファイナンスはhttps://finance.yahoo.co.jp/ Yahoo!ファイナンスヘルプ規約によりスクレイピングを禁止しています。
という訳でこれ以上は回答できかねるので悪しからずご容赦くださいな。

投稿2018/08/16 17:57

編集2018/08/17 08:06
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hikaa

2018/08/17 06:57

回答ありがとうございます。 質問以外のことも教えていただきありがとうございます。コードを整形しました。 「ループ内でChromeのインスタンスを上書きしていませんか。 wh = []と同様に複数保持するようにしてくださいな。」 のところをもう少し詳しく教えていただけないでしょうか。whの複数保持の方法がネットで探してみましたが分かりません・・。
hikaa

2018/08/17 12:22

回答ありがとうございました。ウィンドウの切り替えができるようになりました! スクレイピングは禁止なんですね・・・。別のサイトからデータは取ってくるようにします。 詳しく教えていただきありがとうございました。
umyu

2018/08/17 12:28

@hikaaさんへ 解決できてよかったです。 日経平均株価の著作権は「日本経済新聞社」、TOPIXは「東京証券取引所」のように株価は著作権で保護されている事がありますその点もご注意を。あとスクレイピングはどうしても相手サーバーに負荷が掛かるので、株価のリアルタイムの取得は別口(有料)という事が多いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問