2016-05-19 6 views
1

Ich habe ein wenig Mühe, die Logik Selen durch eine Liste von Elementen wie eine ungeordnete Liste gehen zu gehen, klicken Sie auf einen Link, der zu einem anderen bewegt Seite und dann zurück zur ursprünglichen Seite mit dem nächsten Punkt in der Liste. Zuerst hatte ich Fehler mit den veralteten Elementen, konnte aber feststellen, dass der Browser die Elemente auf der aktuellen Seite zerstört. So habe ich versucht, durch die folgende Abhilfe zu schaffen:Bewegen Sie sich durch eine Liste von Selen-Webdriver-Objekten beim Wechseln der Seiten

list3 = driver.find_elements_by_xpath("//*[@id='treeContainer']//a[starts-with(@id, 's')]") 
tempList3 = {} 
for entry in list3: 
    tempList3[entry.get_attribute("id")] = entry.text 
    surveyNum = entry.get_attribute("id") 
    print(entry.text, entry.tag_name) 
    subList3 = driver.find_elements_by_css_selector("#listContainer > ul > *") 
    print("sublist", len(subList3)) 
    tempMem = {} 
    for each in subList3: 
     print(each.get_attribute("id"), each.text) 
     tempMem[each.get_attribute("id")] = each.text 
     reportNum = each.get_attribute("id") 
     execute_click(driver, "#listContainer > ul a") 
     element = WebDriverWait(driver, 20).until(
      lambda s: s.execute_script("return jQuery.active == 0")) 
     if element: 
      element = WebDriverWait(driver, 5).until(
      EC.element_to_be_clickable((By.LINK_TEXT, "Export to CSV"))) 
      element.click() 
     element = WebDriverWait(driver, 20).until(
      lambda s: s.execute_script("return jQuery.active == 0")) 
     if element: 
      csvRadio = driver.find_element_by_css_selector("#exportValuesLabelsCSV3.radio") 
      csvRadio.click() 
     else: 
      continue 
     csvDownload = driver.find_element_by_css_selector(
      "#butExportToCSV > table > tbody > tr > td:nth-child(1) > div > button") 
     csvDownload.click() 
     element = WebDriverWait(driver, 20).until(
      EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#progress_csv'), 
                "Export completed! Please click here if nothing happens")) 
     driver.find_element_by_xpath("//*[@id='emptySel']/a").click() 
     subList3.clear() 
     subList3 = driver.find_elements_by_css_selector("#listContainer > ul > *") 
     for items in subList3: 
      print("subList3", items.text) 
      if reportNum in tempMem: 
       if tempMem.get(reportNum) in items.text: 
        subList3.remove(items) 
        print("Item removed, items left:", len(subList3)) 
       else: 
        continue 
      continue 
     else: 
      continue 
    tempMem.clear() 
    list3.clear() 
    list3 = driver.find_elements_by_xpath("//*[@id='treeContainer']//a[starts-with(@id, 's')]") 
    for listed in list3: 
     print("list3", listed.text) 
     if surveyNum in tempList3: 
      if tempList3.get(surveyNum) in listed.text: 
       list3.remove(listed) 
      else: 
       continue 
     else: 
      continue 
    continue 
tempList3.clear() 

Nach dem Ausführen es mir keine Fehler bekommen, aber es scheint, dass es nicht Schleife tut ... was habe ich übersehen?

Antwort

1

Ihr Gesamtcode ist schwierig für mich ohne vollständigen Kontext zu folgen. Das heißt, nach Ihrer ursprünglichen Beschreibung, würde ich css Pfade und nth-child() 's:

Nehmen wir an, Sie wollten jeden Link auf Hacker New's Hauptseite finden, und dann eins nach dem anderen klicken Sie auf jeden Link, schlagen die Rückseite Klicken Sie zwischen den Links.

Hacker neue HTML so etwas wie dieses (Stand Mai 2016) aussieht:

<tbody> 
     <tr class="athing"> 
      <td align="right" valign="top" class="title”>…</td> 
      <td valign="top" class="votelinks”>…</td> 
      <td class="title"> 
        <span class="deadmark"></span> 
        <a href="https://github.com/BYVoid/Batsh">A language …</a> 
        <span class="sitebit comhead”>…</span> 
      </td> 
     </tr> 
     <tr>…</tr> 
     <tr class="spacer" style="height:5px"></tr> 
     <tr class="athing"> 
      <td align="right" valign="top" class="title”>…</td> 
      <td valign="top" class="votelinks”>…</td> 
      <td class="title"> 
        <span class="deadmark"></span> 
        <a href="https://chrome.googleblog.com/2016/05/the-google-play-store-coming-to.html">Play Store…</a> 
        <span class="sitebit comhead”>…</span> 
      </td> 
     </tr> 
     … 
</tbody> 

Beispiel Code, um die Ankerelemente zu finden und sie eins nach dem anderen klicken:

from selenium import webdriver 

driver = webdriver.Chrome() 

driver.get("https://news.ycombinator.com/") 

try: 
    # The path to the links you want 
    base_css_path = "tr.athing td.title > a" 

    # Find and get a count for the number of links you will be clicking 
    # Note the plural 'elements' 
    num_elems = len(driver.find_elements_by_css_selector(base_css_path)) 

    # CSS path for finding individual elements 
    ind_css_path = "tbody tr:nth-child({0}) td.title > a" 

    # Starting with an index of 1, we want every 3rd tr child 
    # Looking at Hacker News' structure, we know there are 3 total tr elements 
    # associated with each tr we actually want, so we must multiply our total 
    # element count by 3, and then use a step size of 3 
    for index in range(1, num_elems * 3, 3): 
     # Use the direct css path to acquire the specific element and click it 
     driver.find_element_by_css_selector(ind_css_path.format(index)).click() 

     # Redirect happens 
     # Do whatever you need to do here 

     # Return to the previous page 
     driver.back() 
finally: 
    driver.quit() 
+0

Dies ist auf jeden Fall das Recht Ansatz für dieses Problem. Danke für die Antwort! –

Verwandte Themen