Repository: ssenart/PyGazpar (language: python)

Issue:
Aucun résultat
Bonsoir,

Je tente de faire marcher ce package Python.

Je fais mon test sur mon Ubuntu 20.10, Python 3.8 , Geckodriver 0.29.1 et Firefox 81.0.2+build1-0ubuntu1.

Lorsque je lance le script, il tourne assez longtemps, pour au final ne rien renvoyer : 

```
(venv) jeo@bud:~/dev$ pygazpar -u 'pouet@gmail.com' -p 'pouet'  -w geckodriver -s 30 -t tmp/ -l 0
[]
```

Je semble bien avoir des consommations sur mon compte GRDF : 

![image](https://user-images.githubusercontent.com/701928/114940766-92a13280-9e42-11eb-8a94-da1c6d46b798.png)

Les logs de geckodriver : 

```
1618521671214	geckodriver	INFO	Listening on 127.0.0.1:57303
1618521671227	mozrunner::runner	INFO	Running command: "/usr/bin/firefox" "--marionette" "-headless" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofileL5Xmt8"
*** You are running in headless mode.
console.error: SearchCache: "_readCacheFile: Error reading cache file:" (new Error("", "(unknown module)"))
1618521680829	Marionette	INFO	Listening on port 38081
1618521680904	Marionette	WARN	TLS certificate errors will be ignored for this session
JavaScript error: resource://gre/modules/URIFixup.jsm, line 271: NS_ERROR_FAILURE: Should pass a non-null uri
1618521693174	Marionette	WARN	TimedPromise timed out after 500 ms: stacktrace:
TimedPromise/<@chrome://marionette/content/sync.js:245:13
TimedPromise@chrome://marionette/content/sync.js:230:10
interaction.flushEventLoop@chrome://marionette/content/interaction.js:416:10
webdriverClickElement@chrome://marionette/content/interaction.js:182:31

(firefox:18593): GLib-GObject-CRITICAL **: 23:24:10.655: g_object_get: assertion 'G_IS_OBJECT (object)' failed
1618521884487	Marionette	INFO	Stopped listening on port 38081
```

Une idée :( ?


Discussion / hints:
Bonsoir,

Peux-tu envoyer le fichier de log pygazpar.log dans le dossier tmp/. Il me dira plus de choses que celui du geckodriver. Et est-ce qu'il y a une image error_screenshot.png dans ce même dossier ?

Merci
Stephane 
Bonsoir @ssenart ,

Voici en PJ le fichier pygazpar.log

[pygazpar.log](https://github.com/ssenart/PyGazpar/files/6327936/pygazpar.log)

Je te confirme qu'il n'y avait pas de screenshot dans ce dossier.

Hello,

D'après la log, le programme n'a téléchargé aucun fichier de données dans le répertoire tmp/ après avoir cliqué sur le bouton 'Télécharger'.
En allant sur le site GrDF, peux-tu essayer, manuellement, de télécharger ce même fichier de données ?

En t'aidant du screenshot ci-joint:

![image](https://user-images.githubusercontent.com/37013755/115106267-0be47680-9f64-11eb-8c77-dd959224b081.png)

1. Idéalement, utilise le même navigateur que celui utilisé par PyGazpar.
2. Logue-toi sur le site GrDF et va dans la rubrique 'Suivi de consommation' à partir la page d'accueil.
3. Clique sur l'onglet Consommations : (1) sur le screenshot.
4. Ensuite, sélectionne la consommation par jour : (2) sur le screenshot.
5. Enfin, clique sur le bouton 'Télécharger' : (3) sur le screenshot.

Est-ce que tu récupères bien un fichier de données ?

Peux-tu me donner le nom exacte du fichier téléchargé ?


Hello @ssenart ,

Ouaip, je récupère bien un fichier Consommations gaz_Maison_21122020_15042021.xlsx, avec toutes les infos nécessaires.
Salut,

Je viens de corriger un truc qui pourrait fixer ton problème.

La version avec le fix est la 0.1.26.

Tiens-moi au courant,
Stéphane
Salut,

Merci pour le corretif, malheureusement ça ne change rien.

J'ai fait le test via 2 méthodes :

1)  Ubuntu 20.10 (virtualbox), Python 3.8 , Geckodriver 0.29.1 et Firefox 81.0.2+build1-0ubuntu.
2) Debian WSL2 (Windows) avec Python 3.8, Geckodriver 0.29.1 et Firefox ESR 78.9.0esr-1~deb10u1

Ci-joint le fichier [pygazpar.log](https://github.com/ssenart/PyGazpar/files/6331279/pygazpar.log)

La log que tu as jointe ne correspond pas à la version 0.1.26.

Depuis la version 0.1.26, la log doit commencer par :
```log
2021-04-18 11:41:09,149 INFO [root] PyGazpar 0.1.26
2021-04-18 11:41:09,150 INFO [root] --webdriver /root/geckodriver
2021-04-18 11:41:09,150 INFO [root] --wait_time 30
2021-04-18 11:41:09,150 INFO [root] --tmpdir /tmp
2021-04-18 11:41:09,150 INFO [root] --lastNRows 0
2021-04-18 11:41:09,150 INFO [root] --headfull False
2021-04-18 11:41:09,150 DEBUG [pygazpar.client] Start updating the data...
...
```

As-tu bien fait la mise à jour vers la 0.1.26. La commande est la suivante:

```bash
pip3 install pygazpar --upgrade
```

Et pour vérifier la version installée:

```bash
pip3 list | grep pygazpar
```

doit retourner:

```bash
pygazpar      0.1.26
```

Pour information, j'ai réussi à reproduire ton problème sur une Ubuntu 20.10 (docker), Python 3.8, Geckodriver 0.29.1 et Firefox 87.0 avec PyGazpar 0.1.25 et vérifier que le fix 0.1.26 corrige dans cette même configuration.
Oh désolé, j'avais bien fait la mise a jour sur mon WSL2, mais pas sur Ubuntu. Je viens de tester, et j'ai le meme souci, meme avec la 0.1.26. Voici le fichier de logs en pj.

[pygazpar.log](https://github.com/ssenart/PyGazpar/files/6331463/pygazpar.log)

Merci.

1) Peux-tu vérifier si le fichier Excel de consommation se télécharge bien, mais dans le dossier Download (ou Téléchargement) par défaut de ton compte plutôt que dans le dossier tmpdir comme attendu (c'est ce que j'avais observé).

2) Dans la version 0.1.26, j'ai rajouté un nouveau paramètre (--headfull) qui permet d'ouvrir et voir la progression dans Firefox. En l'utilisant, vois-tu quelque chose de particulier, notamment au moment de télécharger le fichier ?
Alors en effet, je te confirme que le xslx se retrouve dans le dossier Téléchargements de mon home...  Mais le script me renvoie toujours un tableau vide.

Du coup si le xlsx est bien récupéré, ce serait pas un souci de parsing ?
Je ne crois pas.

Le programme s'attend à récupérer le fichier de données dans le dossier tmpdir et pas ailleurs.

Je dois comprendre pourquoi dans tes environnements, il n'est pas télécharger dans ce dossier.

Je vais essayer de reproduire sur une debian.
Pour te donner un maximum d'infos : 

Il s'agit d'une Ubuntu Budgie 20.10 dans Virtualbox.

```
jeo@bud:~$ dpkg -l | grep firef
ii  firefox                               87.0+build3-0ubuntu0.20.10.1        amd64        Safe and easy web browser from Mozilla
ii  firefox-locale-en                     87.0+build3-0ubuntu0.20.10.1        amd64        English language pack for Firefox
ii  firefox-locale-fr                     87.0+build3-0ubuntu0.20.10.1        amd64        French language pack for Firefox
```

```
(venv) jeo@bud:~/dev$ pip list
Package       Version
------------- -------
et-xmlfile    1.0.1
jdcal         1.4.1
openpyxl      2.6.3
pip           20.1.1
pkg-resources 0.0.0
pygazpar      0.1.26
selenium      3.141.0
setuptools    44.0.0
urllib3       1.26.4
wheel         0.34.2
```

Bon sinon, je viens de faire un test avec une image Docker fraichement faite : 

```
FROM python:3.9.4-alpine

RUN apk add  firefox

RUN wget https://github.com/mozilla/geckodriver/releases/download/v0.29.1/geckodriver-v0.29.1-linux64.tar.gz \
    && tar -zxvf geckodriver-v0.29.1-linux64.tar.gz -C /usr/bin \
    && rm geckodriver-v0.29.1-linux64.tar.gz

RUN pip install pygazpar
```

Le lancement du script dans le container renvoie bien ce qu'il faut, donc ça marche. Reste juste à trouver pourquoi ça pète dans le scénario précédent.

Merci d'avoir partager cette information.

- Sur Ubuntu, je suis exactement avec les mêmes versions que toi mais dans un docker tout frais.

Mon docker-compose.yml:
```yaml
version: "2"

services:
  ubuntu:
    image: ubuntu:20.10
    container_name: ubuntu
    restart: unless-stopped
    network_mode: bridge
    entrypoint: tail -f /dev/null
```
Et ça fonctionne très bien.

- Sur Debian, ça ne fonctionne pas, et vu les erreurs dans la log, je pense à un problème de compatibilité Geckodriver 0.29.1 avec Firefox-ESR 78.9.0 trop ancien. J'ai déjà eu ça sur Alpine Linux avevc Firefox-ESR.

```log
Traceback (most recent call last):
  File "/root/TestPyGazpar/.venv/lib/python3.7/site-packages/pygazpar/webdriverwrapper.py", line 103, in find_element_by_xpath
    element = self.__driver.find_element_by_xpath(xpath)
  File "/root/TestPyGazpar/.venv/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "/root/TestPyGazpar/.venv/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/root/TestPyGazpar/.venv/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/root/TestPyGazpar/.venv/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Failed to decode response from marionette
```
As-tu ta log Debian pour confirmer qu'on a tous les deux le même problème (compatibilité) ?
Pour Ubuntu, ok, même si je ne comprends pas pourquoi...  Pour Debian, ou retrouves-tu ces messages d'erreur ? De mon coté impossible de les avoir.

De toute façon mon but est de faire tourner ça dans une image docker.  Quel est le combo gagnant de ton coté ?

Je tente ma chance avec instrumentisto/geckodriver:latest, mais je me retrouve avec des erreurs : 

```
root@bc99c44f7313:/tmp# cat pygazpar_geckodriver.log
1618767446822   geckodriver     INFO    Listening on 127.0.0.1:54079
1618767446828   mozrunner::runner       INFO    Running command: "/usr/bin/firefox" "--marionette" "-headless" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofilec5odUR"
*** You are running in headless mode.
[GFX1-]: glxtest: libpci missing
[GFX1-]: glxtest: libEGL missing
[GFX1-]: glxtest: libGL.so.1 missing
[GFX1-]: glxtest: libEGL missing
[GFX1-]: No GPUs detected via PCI

(/opt/firefox/firefox-bin:81): GLib-GObject-CRITICAL **: 17:37:27.310: g_object_set: assertion 'G_IS_OBJECT (object)' failed

(/opt/firefox/firefox-bin:106): GLib-GObject-CRITICAL **: 17:37:27.363: g_object_set: assertion 'G_IS_OBJECT (object)' failed
console.warn: SearchSettings: "get: No settings file exists, new profile?" (new Error("", "(unknown module)"))
1618767448149   Marionette      INFO    Listening on port 36753
1618767448247   Marionette      WARN    TLS certificate errors will be ignored for this session

(/opt/firefox/firefox-bin:179): GLib-GObject-CRITICAL **: 17:37:28.365: g_object_set: assertion 'G_IS_OBJECT (object)' failed
1618767602267   Marionette      INFO    Stopped listening on port 36753
```

```
pygazpar.webdriverwrapper (WARNING): find_element_by_xpath('//div[2]/div[2]/div/a/div'): Welcome page: 'Acceder' button of 'Suivi de consommation' -> Not found
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-packages/pygazpar/webdriverwrapper.py", line 103, in find_element_by_xpath
    element = self.__driver.find_element_by_xpath(xpath)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //div[2]/div[2]/div/a/div
```


Edit : je n'ai rien dit, l'image instrumentisto/geckodriver:latest semble bien fonctionner :)

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5ab6e20..b04ee6e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,7 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [0.1.27](https://github.com/ssenart/PyGazpar/compare/0.1.26...0.1.27) - 2021-04-20
 ### Fixed
-- [#10](https://github.com/ssenart/PyGazpar/issues/10) : Does not download data file in tmpdir as expected (instead it is downloaded in the default user Download directory). The previous attempt in version 0.1.26 is a failure. The origin of the bug is that we send relative tmp directory path to Webdriver. Additionally, it has to be normalized to the runtime OS.
+- [#10](https://github.com/ssenart/PyGazpar/issues/10) : Does not download data file in tmpdir as expected (instead it is downloaded in the default user Download directory). The previous attempt in version 0.1.26 is a failure. The origin of the bug is that we send a relative tmp directory path to Webdriver. Additionally, this path has to be normalized to the runtime OS (using slash or backslash).
 
 ## [0.1.26](https://github.com/ssenart/PyGazpar/compare/0.1.25...0.1.26) - 2021-04-18
 ### Fixed


Test patch:
diff --git a/tests/test_client.py b/tests/test_client.py
index abaa5c0..1d95b6a 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -54,21 +54,21 @@ def test_hourly_live(self):
 
         assert len(client.data()) == 0
 
-    # @pytest.mark.skip(reason="Live data are not available")
+    @pytest.mark.skip(reason="Live data are not available")
     def test_daily_live(self):
         client = Client(self.__username, self.__password, self.__webdriver, self.__wait_time, self.__tmp_directory, 1, True, Frequency.DAILY)
         client.update()
 
         assert len(client.data()) == 1
 
-    # @pytest.mark.skip(reason="Live data are not available")
+    @pytest.mark.skip(reason="Live data are not available")
     def test_weekly_live(self):
         client = Client(self.__username, self.__password, self.__webdriver, self.__wait_time, self.__tmp_directory, 1, True, Frequency.WEEKLY)
         client.update()
 
         assert len(client.data()) == 1
 
-    # @pytest.mark.skip(reason="Live data are not available")
+    @pytest.mark.skip(reason="Live data are not available")
     def test_monthly_live(self):
         client = Client(self.__username, self.__password, self.__webdriver, self.__wait_time, self.__tmp_directory, 1, True, Frequency.MONTHLY)
         client.update()