0

サイトのスパイダー機能の基礎として、選択ボックスのオプション リストを使用してPython2.7おりSelenium、使用しようとしています。コードを見てみましょう。

 select = self.br.find_element_by_name( field )  #get the select element            
 options = select.find_elements_by_tag_name("option") #get all the options into a list

 for option in options: #iterate over the options
     print "starting loop on option %s" % option.text

     #now get the option with the value that is currently being iterated over and select it from the original select box source
     self.br.find_element_by_xpath("//select[@name='%s']/option[@value='%s']" % ( field, option.get_attribute("value") ) ).click() #the click takes you to a new page

     source = self.br.page_source #get the new page source

     #now check to see if some required data is on the navigated page, and print some stuff if so
     if "There is no summary data available." not in source:
          print "the new page is good! Here are the original args: ", option.text, option.get_attribute("value") 
     #time to go back to the main page and click the next option element
     self.br.back()
     print "went backwards" #for debugging

そのため、 の後の 2 回目の反復まですべてが機能しself.br.back()、ループが再び開始されます。次のような非常に長い Selenium エラーが表示されます。

 selenium.common.exceptions.StaleElementReferenceException: Message: u'Element not found in the cache - perhaps the page has changed since it was looked up' ; Stacktrace: 
at fxdriver.cache.getElementAt (resource://fxdriver/modules/web_element_cache.js:7643)
at Utils.getElementAt (file:///tmp/tmpm_ciQJ/extensions/fxdriver@googlecode.com/components/command_processor.js:7232)
at WebElement.getElementAttribute (file:///tmp/tmpm_ciQJ/extensions/fxdriver@googlecode.com/components/command_processor.js:10335)
at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpm_ciQJ/extensions/fxdriver@googlecode.com/components/command_processor.js:10840)
at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpm_ciQJ/extensions/fxdriver@googlecode.com/components/command_processor.js:10845)
at DelayedCommand.prototype.execute/< (file:///tmp/tmpm_ciQJ/extensions/fxdriver@googlecode.com/components/command_processor.js:10787) 

明らかに、エラーは要素が存在しない可能性があることを示していますが、以前のページセッション中に取得されたオブジェクトのリストを反復処理しているだけなので、どのように可能でしょうか...

いずれにせよ、これを行うにはどうすればよいですか?私が試している方法は最善の方法ではないかもしれません...

4

1 に答える 1

1

私はPythonに完全に精通しているわけではないので、これを少し作り直す必要があるかもしれません. これで少なくとも始めることができると思います。

from selenium.webdriver.support.ui import Select, WebDriverWait

select = self.br.find_element_by_name( field )  #get the select element            
options = select.find_elements_by_tag_name("option") #get all the options into a list

optionsList = []

for option in options: #iterate over the options, place attribute value in list
    optionsList.append(option.get_attribute("value"))

for optionValue in optionsList:
    print "starting loop on option %s" % optionValue

    select = Select(self.br.find_element_by_name( field ))
    select.select_by_value(optionValue)

    source = self.br.page_source #get the new page source

    #now check to see if some required data is on the navigated page, and print some stuff if so
    if "There is no summary data available." not in source:
         print "the new page is good! Here are the original args: ", optionValue
    #time to go back to the main page and click the next option element
    self.br.back()
    print "went backwards" #for debugging

ここでの考え方は、最初の for ループでオプション値のリストを作成し、それらのオプション値を反復処理して 2 番目の for ループで 2 番目のページに移動することです。これらのオプション値を選択するには、python Select ライブラリを使用します。2 番目の for ループを通過するたびに、ドロップダウンへの新しい参照を取得する行を追加しました。

これがお役に立てば幸いです

于 2013-09-18T15:12:31.173 に答える