2016-03-25 12 views
2

Selenium Python'a yeni geldim. Sayfa başına 10 olacak profil URL'lerini almaya çalışıyorum. while kullanmadan, tüm 10 URL'yi ancak tek başına yalnızca ilk sayfa için getirebiliyorum. while kullandığımda, yineler, ancak sayfa başına yalnızca 3 veya 4 URL alır.Yineleme sırasında gerekli tüm bağlantılar alınamıyor - Selenium Python

Tüm 10 bağlantıyı getirip sayfalar arasında yinelemeye devam etmem gerekiyor. Sanırım, StaleElementReferenceException

ile ilgili bir şey yapmalıyım. Aşağıdaki kod verildiği zaman,

.

def test_connect_fetch_profiles(self): 
    driver = self.driver 
    search_data = driver.find_element_by_id("main-search-box") 
    search_data.clear() 
    search_data.send_keys("Selenium Python") 
    search_submit = driver.find_element_by_name("search") 
    search_submit.click() 
    noprofile = driver.find_elements_by_xpath("//*[text() = 'Sorry, no results containing all your search terms were found.']") 
    self.assertFalse(noprofile) 
    while True: 
     wait = WebDriverWait(driver, 150) 
     try: 
      profile_links = wait.until(EC.presence_of_all_elements_located((By.XPATH,"//*[contains(@href,'www.linkedin.com/profile/view?id=')][text()='LinkedIn Member'or contains(@href,'Type=NAME_SEARCH')][contains(@class,'main-headline')]"))) 
      for each_link in profile_links: 
       page_links = each_link.get_attribute('href') 
       print(page_links) 
       driver.implicitly_wait(15) 
       appendFile = open("C:\\Users\\jayaramb\\Documents\\profile-links.csv", 'a') 
       appendFile.write(page_links + "\n") 
       appendFile.close() 
       driver.implicitly_wait(15) 
       next = wait.until(EC.visibility_of(driver.find_element_by_partial_link_text("Next"))) 
       if next.is_displayed(): 
        next.click() 
       else: 
        print("End of Page") 
        break 
     except ValueError: 
      print("It seems no values to fetch") 
     except NoSuchElementException: 
      print("No Elements to Fetch") 
     except StaleElementReferenceException: 
      print("No Change in Element Location") 
     else: 
       break 

orada gerekli profil URL'yi getirmek için başka etkili yolu vardır ve sayfalar arasında yineleme tutmak varsa bana bildirin.

cevap

0

Benim için iyi çalışan benzer bir kurulum oluşturdum. Sonraki düğmeyi tıklatmaya çalışan selenyum ile ilgili bazı sorunlar yaşadım, ancak bunun yerine bir sonraki düğmenin görünümde olmaması nedeniyle bir WebDriverException atar. Bu nedenle, sonraki düğmeyi tıklamak yerine, href-niteliğini alıyorum ve yeni sayfayı driver.get() ile yükleyip, gerçek bir tıklamayı test etmeyi daha kararlı hale getiriyorum.

def test_fetch_google_links(): 

    links = [] 

    # Setup driver 
    driver = webdriver.Firefox() 
    driver.implicitly_wait(10) 
    driver.maximize_window() 

    # Visit google 
    driver.get("https://www.google.com") 

    # Enter search query 
    search_data = driver.find_element_by_name("q") 
    search_data.send_keys("test") 

    # Submit search query 
    search_button = driver.find_element_by_xpath("//button[@type='submit']") 
    search_button.click() 

    while True: 
     # Find and collect all anchors 
     anchors = driver.find_elements_by_xpath("//h3//a") 
     links += [a.get_attribute("href") for a in anchors] 

     try: 
      # Find the next page button 
      next_button = driver.find_element_by_xpath("//a[@id='pnnext']") 
      location = next_button.get_attribute("href") 
      driver.get(location) 

     except NoSuchElementException: 
      break 

    # Do something with the links 
    for l in links: 
     print l 

    print "Found {} links".format(len(links)) 

    driver.quit() 
+0

Vay !! Bu işe yaradı ... Büyük teşekkürler :) :) 'İleri' düğmesine tıklamanız gerektiğinde bana 'StaleElementReferenceException' doğru kullanımı konusunda yardımcı olabilir misiniz? –

+0

StaleElementReferenceException, başvuruda bulunduğunuz öğenin artık orada olmadığını belirten selenyumdur. Bu, bazı JavaScript sayfanın içeriğini dinamik olarak güncellediğinde veya öğeyi içeren sayfadan ayrıldığında ortaya çıkabilir. Bu nedenle, eski eleman artık kullanılamaz ve güncellenmesi gerekir. Bu [makale] (http://engineeringquality.blogspot.nl/2013/08/ways-of-dealing-with.html), bununla başa çıkmanın bazı yollarını listelemektedir. – sowa

+0

Teşekkürler tonnne :) :) Yardımın için teşekkürler :) :) –

İlgili konular