2017-01-31 5 views
0

Я сделал программу, которая набирает одну запись из процесса Google Sheet, затем удаляет ее и т. Д. Если я обновлю Google Sheet, то программа будет вычитать запись в следующем цикле и процесс на нем, а затем удалить, , но он работает только 1 или 2 часа, а затем программа выдает ошибку:Как предотвратить сбой моей программы Selenium/Python?

enter image description here

Что может Я добавляю в свою программу, чтобы моя программа никогда не останавливалась?

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
import time 
import traceback 
import string 
import gspread 
from oauth2client.service_account import ServiceAccountCredentials 
from selenium.common.exceptions import NoAlertPresentException 
from selenium.common.exceptions import UnexpectedAlertPresentException 


Email=raw_input('Please Enter your Email: ') 
password=raw_input('Please Enter Password: ') 


print("\n******Don't Interrupt the Script******") 
print('#script is Runing............\n') 



chrome_options = webdriver.ChromeOptions() #going to chrome options 
chrome_options.add_argument("--start-maximized") 
prefs = {"profile.default_content_setting_values.notifications" : 2 #turn off all notifications 
     ,"profile.managed_default_content_settings.images": 2} #disable images 
chrome_options.add_experimental_option("prefs",prefs) 
driver = webdriver.Chrome(chrome_options=chrome_options) # passing paramaters to chrome 

driver.get('https://accounts.google.com') 
time.sleep(3) 

#giving Email------------------- 
email = driver.find_element_by_id('Email') 
email.send_keys(Email, Keys.RETURN) 

#giving password---------------- 
time.sleep(3) 
email = driver.find_element_by_id('Passwd') 
email.send_keys(password, Keys.RETURN) 


#credentials + attach with googleSheet------------------------------ 
scope = ['https://spreadsheets.google.com/feeds'] 
credentials = ServiceAccountCredentials.from_json_keyfile_name('stephens-31d8490b5bd2.json', scope) 
google_sheet = gspread.authorize(credentials) 
workSheet = google_sheet.open("Video Access Master Sheet").worksheet("Sheet1") 



while True: 
    #fetch Records from Rows 2 to 50 and save on list----------------- 
    for i in range(2,51): 
     li_url=[] 
     li_email=[] 
     row=workSheet.row_values(i) 
     for b in row: 
      if 'youtu' in b: 
       li_url.append(b) 

       #find record which you append on list and then delete from googleSheet-------------------- 
       cell = workSheet.find(b) 
       row = cell.row 
       col = cell.col 
       workSheet.update_cell(row,col, '') 
       print 'Fetching Values From Row '+str(i)+'....' 
      elif '@' in b: 
       li_email.append(b) 
      elif b=='': 
       continue 
      else: 
       continue 

     #********************************************************* 
     #getting length list of li_url and apply condition on it----------------------------------------------- 
     length=len(li_url) 
     if length==0: 
      continue 
     else: 
      try: 
       #getting URLs from list and put into driver.get--------------------------------------------------------- 
       for a in li_url: 
        driver.get(a) 
        time.sleep(3) 
        driver.find_element_by_css_selector('.yt-uix-button-icon.yt-uix-button-icon-info.yt-sprite').click() 
        time.sleep(3) 
        driver.find_element_by_css_selector('.yt-uix-button.yt-uix-button-size-default.yt-uix-button-default.metadata-share-button').click() 
        time.sleep(2) 
        put_email=driver.find_element_by_css_selector('.yt-uix-form-input-textarea.metadata-share-contacts') 

        #getting emails from email list-------------------------------------------------------------- 
        put_email.send_keys(li_email[0]) 
        time.sleep(2) 
        driver.find_element_by_css_selector('.yt-uix-button.yt-uix-button-size-default.yt-uix-button-primary.sharing-dialog-button.sharing-dialog-ok').click() 
        time.sleep(4) 
        driver.find_element_by_xpath('.//*[@id="video-header"]/div/button[2]/span').click() 
        time.sleep(10) 

       #for notifications and alters-------------------------------------------- 
       try: 
        driver.switch_to.alert.accept() 
       except NoAlertPresentException: 
        pass 
       except UnexpectedAlertPresentException: 
        pass 
      except: 
       traceback.print_exc 
       pass 

     print 'Row '+str(i)+' Successfully Updated. \n' 
    time.sleep(120) #while loop sleep for 20minuts 

Это ошибка я получил:

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "<string>", line 56, in parse 
    File "<string>", line 35, in parse 
cElementTree.ParseError: no element found: line 1, column 0 
+1

Я думаю, что он показывает ошибку, если нет записи больше. Так что я думаю, вам нужно проверить пустую запись. Если нет записи, остановите ее. какие-то вещи – NarendraR

+0

Согласен. Ошибка связана с тем, как вы проверяете строки. Почему бы вам не попробовать 'if row_values ​​(i) None: continue' – Sai

+0

цикл будет запускаться каждые 2 минуты и проверять все строки .. –

ответ

0

По какой-то причине cell = workSheet.find(b) терпит неудачу. Там могут быть плохие данные; не видя ввода, это все догадывается.

Поскольку вы уже знаете номер строки, вы можете избежать использования cell = workSheet.find(b), просто отслеживая столбцы, которые вы просматриваете, и, наконец, вызывая workSheet.update_cell(i, col, '') после копирования данных.

+0

Я так не думаю .. потому что мои программы работают отлично почти 1 час, но после этого он дает ошибку повышения. Я думаю, что что-то не так с циклом .., который не работает постоянно, но я не знаю, как я могу решить это .. :( –