python+selenium+chrome back,forward,refreshを実現する際の注意点


python+selenium+chrome back,forward,refreshを実現する際の注意点
1.背景
seleniumシミュレーションブラウザを使用する場合、ナビゲーションバーへの3つのボタン:後退、前進、リフレッシュを使用することがよくあります.に表示されます.seleniumに対応する方法は,back(),forward(),refresh()である.しかし、前に配置した要素を直接使用すると、要素が焦げてしまうという問題が発生します.
2.環境
  • python 3.6.1
  • システム:win 7
  • IDE:pycharm
  • chromeブラウザ
  • をインストールしました
  • chromedriver
  • を構成
  • selenium 3.7.0

  • 3.コード解析
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import Select
    
    import time
    import random
    
    #   xpath  
    chrome_options = webdriver.ChromeOptions()
    extension_path = 'D:/extension/XPath-Helper_v2.0.2.crx'
    chrome_options.add_extension(extension_path)
    
    browser = webdriver.Chrome(chrome_options=chrome_options)
    # browser.maximize_window()
    wait = WebDriverWait(browser, 25)
    waitPopWindow = WebDriverWait(browser, 25)
    
    
    firstUrl = "https://www.taobao.com/"
    browser.get(firstUrl)
    time.sleep(random.randrange(3, 5, 1))
    
    #             
    searchInput = browser.find_element_by_xpath("//input[@id='q' and @class='search-combobox-input']")
    print(f"searchInputBefore = {searchInput}")
    searchInput.click()
    searchInput.send_keys("abcTest")
    
    time.sleep(random.randrange(3, 5, 1))
    
    #      :back()
    #   amazon  
    secondUrl = "https://www.amazon.com/"
    browser.get(secondUrl)
    time.sleep(random.randrange(3, 5, 1))
    #       
    browser.back()
    
    #      :refresh()
    # browser.refresh()
    
    time.sleep(random.randrange(3, 5, 1))
    
    #             
    searchInput = browser.find_element_by_xpath("//input[@id='q' and @class='search-combobox-input']")
    print(f"searchInputAfter = {searchInput}")
    searchInput.send_keys("abcTest")
    
    time.sleep(random.randrange(3, 5, 1))
    
    #       amazon  
    browser.forward()
    
    print(f"    ")
    time.sleep(random.randrange(3, 5, 1))
    browser.quit()
  • の結果、前後の2つの淘宝ページでは、入力ボックスのIDが異なり、古い要素は使用できません.
  • と同様に、ページがrefreshされると、要素のIDも変化する.
  • searchInputBefore = .webdriver.remote.webelement.WebElement (session="1adae9c334324c3e9137796ea16fdc12", element="0.7525547144214484-1")>
    searchInputAfter = .webdriver.remote.webelement.WebElement (session="1adae9c334324c3e9137796ea16fdc12", element="0.746747334537434-1")>
        
  • line:49行を注釈すると、
  • という状況になります.
    Traceback (most recent call last):
      File "E:/PyCharmCode/amazonSearchClick/test.py", line 48, in 
        searchInput.send_keys("abcTest")
      File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webelement.py", line 352, in send_keys
        'value': keys_to_typing(value)})
      File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webelement.py", line 501, in _execute
        return self._parent.execute(command, params)
      File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 308, in execute
        self.error_handler.check_response(response)
      File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
      (Session info: chrome=63.0.3239.132)
      (Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.1.7601 SP1 x86_64)
  • すなわち、ページが変更され、要素が再ロードされると、要素のIDが変化し、再取得が必要となる.