2016-05-19 2 views
1

У меня возникли проблемы с попыткой собрать логику селена, проходящего через список элементов, таких как неупорядоченный список, щелкните ссылку, которая перемещается в другую затем перейдите к исходной странице, следуя следующему элементу в списке. Сначала у меня были ошибки с элементами, которые были устаревшими, но были в состоянии найти с некоторым взглядом, что, когда браузер уничтожает элементы на текущей странице, они становятся устаревшими. Таким образом, я попытался исправить это следующим:Перемещение по списку объектов селенового webdriver при переключении страниц

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() 

После запуска это я не получаю никаких ошибок, однако, кажется, что это не петля ... Что бы я проглядел?

ответ

1

Ваш полный код для меня невозможен без полного контекста. Тем не менее, учитывая ваше первоначальное описание, я использовал бы css-пути и nth-child()'s:

Допустим, вы хотели найти каждую ссылку на главной странице Hacker New, а затем по одному щелчком по каждой ссылке, нажав на спину нажатие кнопки между кликами.

Hacker New в HTML выглядит следующим образом (по состоянию на май 2016):

<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> 

Пример кода, чтобы найти элементы, анкерные и нажмите их один за другим:

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

Это, безусловно, право подход к этой проблеме. Спасибо, что ответили! –

Смежные вопросы