Coverage for carregarDados.py: 100%

74 statements  

« prev     ^ index     » next       coverage.py v7.1.0, created at 2023-02-02 11:17 -0300

1import csv # biblioteca utilizada para ler e escrever arquivos csv 

2import pandas as pd # biblioteca utilizada para arquivos em dataframe 

3from datetime import datetime # biblioteca utilizada para calcular o tempo do processo 

4import time # biblioteca utilizada para impor delay para carregamento do site 

5from selenium import webdriver # configuracoes para abrir o navegador e capturar os dados 

6from selenium.webdriver.common.by import By 

7from selenium.webdriver.chrome.service import Service 

8from webdriver_manager.chrome import ChromeDriverManager 

9 

10def gerarCsv(): 

11# funcao que gera os arquivos csv vazios apenas com os nomes das colunas 

12 

13 with open('./testesUnitarios/csvTurmasColetadasFGA.csv', 'w', newline='', encoding="utf-8") as csvTurmasColetadasFGA: 

14 csv.writer(csvTurmasColetadasFGA, delimiter=';').writerow(['codigNomeMateria', 'codigoTurma', 'ano', 'semestre', 'professor', 'cargahoraria', 'horario', 'vagasOfertadas', 'vagasOcupadas', 'local', 'salaSeparada', 'predio','lotacao', 'horarioSeparado', 'percDisciplina', 'percOcupacaoReal','percOcupacaoTotal']) 

15 csvTurmasColetadasFGA.close() 

16 

17 with open('./testesUnitarios/csvTurmasColetadasQueNaoSaoFGA.csv', 'w', newline='', encoding="utf-8") as csvTurmasColetadasQueNaoSaoDaFGA: 

18 csv.writer(csvTurmasColetadasQueNaoSaoDaFGA, delimiter=';').writerow(['codigNomeMateria', 'codigoTurma', 'ano', 'semestre', 'professor', 'cargahoraria', 'horario', 'vagasOfertadas', 'vagasOcupadas', 'local', 'salaSeparada', 'predio','lotacao', 'horarioSeparado', 'percDisciplina', 'percOcupacaoReal','percOcupacaoTotal']) 

19 csvTurmasColetadasQueNaoSaoDaFGA.close() 

20 # fim metodo gerarCsv 

21 

22def gerarConsulta(nivel, depto, ano, periodo, listaTurmasColetadas): 

23# funcao que preeenche os campos da pagina Sigaa para fazer a consulta e chama a funcao para coletar os dados 

24 

25 servico = Service(ChromeDriverManager().install()) 

26 opcoes = webdriver.ChromeOptions() 

27 opcoes.add_experimental_option('excludeSwitches', ['enable-logging']) 

28 navegador = webdriver.Chrome(service=servico, options=opcoes) 

29 url = 'https://sigaa.unb.br/sigaa/public/turmas/listar.jsf?aba=p-ensino' 

30 navegador.get(url) 

31 

32 navegador.find_element(By.NAME, 'formTurma:inputNivel').send_keys(nivel) 

33 navegador.find_element(By.NAME, 'formTurma:inputDepto').send_keys(depto) 

34 navegador.find_element(By.NAME, 'formTurma:inputAno').clear() 

35 navegador.find_element(By.NAME, 'formTurma:inputAno').send_keys(ano) 

36 navegador.find_element(By.NAME, 'formTurma:inputPeriodo').send_keys(periodo) 

37 navegador.find_element(By.NAME, 'formTurma:j_id_jsp_1370969402_11').click() 

38 

39 time.sleep(2) 

40 coletarTurmas(navegador, listaTurmasColetadas) 

41 navegador.quit() 

42 return listaTurmasColetadas 

43# fim metodo gerarConsulta 

44 

45def coletarTurmas(navegador, listaTurmasColetadas): 

46# funcao que captura os dados da pagina Sigaa e armazena em uma lista 

47 

48 # armazena a tabela inteira 

49 listaTodosElementosDaPagina = navegador.find_elements(By.XPATH, '//*[@id="turmasAbertas"]/table/tbody/tr') 

50 # encontra os elementos da pagina e armazena em listas de acordo com o tipo 

51 listaCodigoTurma = navegador.find_elements(By.CLASS_NAME, "turma") 

52 listaProfCargaHor = navegador.find_elements(By.CLASS_NAME, "nome") 

53 listaAnoSemestre = navegador.find_elements(By.CLASS_NAME, "anoPeriodo") 

54 listaHorario = (navegador.find_elements(By.XPATH, "//*[@id='turmasAbertas']/table/tbody/tr//td[4]")) 

55 listaVagasOfertadas = navegador.find_elements(By.XPATH, '//*[@id="turmasAbertas"]/table/tbody/tr/td[6]') 

56 listaVagasOcupadas = navegador.find_elements(By.XPATH, '//*[@id="turmasAbertas"]/table/tbody/tr/td[7]') 

57 listaLocal = (navegador.find_elements(By.XPATH, "//*[@id='turmasAbertas']/table/tbody/tr//td[8]")) 

58 

59 indLinhaAcumulada = 0 

60 indCabecalhoAtual = 0 

61 

62 for linhaAtual in listaTodosElementosDaPagina: 

63 # verifica se eh cabecalho da disciplina 

64 if linhaAtual.get_attribute("class") == 'agrupador': 

65 linhaCabecalho = linhaAtual.find_elements(By.XPATH, "//span[@class='tituloDisciplina']")[indCabecalhoAtual] 

66 codigoNomeMateria = linhaCabecalho.get_attribute('innerHTML') 

67 indCabecalhoAtual += 1 

68 # turmas do mesmo cabecalho estao agrupadas em Linha Par e LinhaImpar 

69 if linhaAtual.get_attribute("class") == 'linhaPar' or linhaAtual.get_attribute("class") == 'linhaImpar': 

70 local = listaLocal[indLinhaAcumulada].get_attribute('innerText').strip() 

71 profCargaHor = listaProfCargaHor[indLinhaAcumulada].get_attribute('innerHTML') 

72 professor, cargahoraria = profCargaHor.split(" (") 

73 cargahoraria, _ = cargahoraria.split(")") 

74 codigoTurma = listaCodigoTurma[indLinhaAcumulada].get_attribute('innerHTML') 

75 anoSemestre = listaAnoSemestre[indLinhaAcumulada].get_attribute('innerHTML') 

76 ano, semestre = anoSemestre.split(".") 

77 horario = listaHorario[indLinhaAcumulada].get_attribute('innerText').strip() 

78 vagasOfertadas = listaVagasOfertadas[indLinhaAcumulada].get_attribute('innerHTML') 

79 vagasOcupadas = listaVagasOcupadas[indLinhaAcumulada].get_attribute('innerHTML') 

80 listaTurmasColetadas.append([codigoNomeMateria, codigoTurma, ano, semestre, professor, cargahoraria, horario, vagasOfertadas, vagasOcupadas, local]) 

81 indLinhaAcumulada += 1 

82 

83 return listaTurmasColetadas 

84# fim metodo coletarTurmas 

85 

86def salvarTurmasColetadasNoCsvFiltrandoFGA(listaTurmasColetadas): 

87# funcao que salva as turmas coletadas no arquivo csv verificando se sao disciplinas da FGA ou nao 

88 

89 # salva somente as que tem 'FGA' no campo 'local' - dados[inidice][9] 

90 with open('./testesUnitarios/csvTurmasColetadasFGA.csv', 'a', newline='', encoding="utf-8") as csvTurmasColetadasFGA: 

91 for indice, _ in enumerate(listaTurmasColetadas): 

92 if 'FGA' in listaTurmasColetadas[indice][9]: 

93 csv.writer(csvTurmasColetadasFGA, delimiter=';').writerow(listaTurmasColetadas[indice]) 

94 csvTurmasColetadasFGA.close() 

95 

96 # salva disciplinas que nao tem 'FGA' no campo 'local' - dados[indice][9] - para teste unitario 

97 with open('./testesUnitarios/csvTurmasColetadasQueNaoSaoFGA.csv', 'a', newline='', encoding="utf-8") as csvTurmasColetadasQueNaoSaoDaFGA: 

98 for indice, _ in enumerate(listaTurmasColetadas): 

99 if 'FGA' not in listaTurmasColetadas[indice][9]: 

100 csv.writer(csvTurmasColetadasQueNaoSaoDaFGA, delimiter=';').writerow( 

101 listaTurmasColetadas[indice]) 

102 csvTurmasColetadasQueNaoSaoDaFGA.close() 

103# fim metodo salvarTurmasColetadasNoCsvFiltrandoFGA 

104''' 

105if __name__ == '__main__': 

106# main - para testes isolados de cada metodo 

107 

108 dataHoraInicioDoProcesso = datetime.now() 

109  

110 gerarCsv() 

111  

112 listaTurmasColetadas = [] 

113 gerarConsulta('GRADUAÇÃO', 'FACULDADE DO GAMA - BRASÍLIA', '2022', '2', listaTurmasColetadas) 

114 print('Coleta do departamento FACULDADE DO GAMA - BRASÍLIA ok') 

115  

116 gerarConsulta('GRADUAÇÃO', 'DEPTO CIÊNCIAS DA COMPUTAÇÃO - BRASÍLIA', '2022', '2', listaTurmasColetadas) 

117 print('Coleta do departamento DEPTO CIÊNCIAS DA COMPUTAÇÃO - BRASÍLIA ok') 

118  

119 gerarConsulta('GRADUAÇÃO', 'INSTITUTO DE FÍSICA - BRASÍLIA', '2022', '2', listaTurmasColetadas) 

120 print('Coleta do departamento INSTITUTO DE FÍSICA - BRASÍLIA ok') 

121  

122 gerarConsulta('GRADUAÇÃO', 'INSTITUTO DE QUÍMICA - BRASÍLIA', '2022', '2', listaTurmasColetadas) 

123 print('Coleta do departamento INSTITUTO DE QUÍMICA - BRASÍLIA ok') 

124  

125 gerarConsulta('GRADUAÇÃO', 'DEPARTAMENTO DE ENGENHARIA MECANICA - BRASÍLIA', '2022', '2', listaTurmasColetadas) 

126 print('Coleta do departamento DEPARTAMENTO DE ENGENHARIA MECANICA - BRASÍLIA ok') 

127  

128 gerarConsulta('GRADUAÇÃO', 'DEPARTAMENTO DE MATEMÁTICA - BRASÍLIA', '2022', '2', listaTurmasColetadas) 

129 print('Coleta do departamento DEPARTAMENTO DE MATEMÁTICA - BRASÍLIA ok') 

130  

131 # salvando dados em um arquivo .csv para uso em testes unitarios e em testes de metodos isolados 

132 salvarTurmasColetadasNoCsvFiltrandoFGA(listaTurmasColetadas) 

133  

134 dataHoraFimDoProcesso = datetime.now() 

135 print(f'\nDuração do processo de coleta e carregamento das turmas: {dataHoraFimDoProcesso - dataHoraInicioDoProcesso}\n') 

136# fim main 

137'''