J'essaie de télécharger un google doc au format pdf en utilisant Selenium en Python. Malheureusement, mes connaissances html sont assez minimes et par conséquent je ne sais pas de quel html j'ai besoin pour cliquer sur le fichier, puis le télécharger au format PDF. Je me rends compte que je peux utiliser l'outil de développement Web pour obtenir du HTML, mais cela ne fonctionne pas si bien pour moi.

Voici ce que j'ai essayé jusqu'à présent:

from selenium import webdriver 

url = ' https://docs.google.com/document/d/1Y1n-RR5j_FQ9WFMG8E_ajO0OpWLNANRu4lQCxTw9T5g/edit?pli=1' 

browser = webdriver.Firefox()
browser.get(url)

Toute aide serait appréciée; Merci!

1
hiqbal 16 juil. 2015 à 23:42

2 réponses

Meilleure réponse

Comme vous le mentionnez dans votre commentaire, Google Drive n'aime pas être gratté.

La commande drive semble être le bon outil pour ce type de travail. - Vous essayez de le faire, mais pas comme vous le souhaitez. Selon la documentation (c'est-à-dire que je ne l'ai pas testé), cette commande semble télécharger votre fichier:

drive pull --export docx --id 1Y1n-RR5j_FQ9WFMG8E_ajO0OpWLNANRu4lQCxTw9T5g

(De plus, en général, je trouve que le moyen le plus simple d'utiliser Selenium est d'utiliser Selenium IDE pour dire Selenium ce que vous voulez faire, puis exportez le cas de test résultant en accédant à File > Export Test Case As... > Python 2 / unittest / Web Driver.)

J'espère que cela pourra aider.

1
Travis 16 juil. 2015 à 22:04

J'ai une solution qui fonctionne, je ne sais pas si Google mettra à jour pour atténuer cela. Maintenant, c'est en c #, mais la fonctionnalité sélénium est fondamentalement la même. Afficher tous les éléments du menu, à l'exception du téléchargement en tant que menu et renvoyer le téléchargement en tant que webelement. Utilisez du sélénium pour cliquer dessus, puis sélectionnez un format et renvoyez également l'élément Web pour cliquer. Je ne pouvais pas faire un clic en utilisant uniquement javascript, je ne savais pas comment ils l'avaient déclenché, mais cliquer dessus en utilisant le pilote de sélénium fonctionnait très bien.

Profitez au maximum de la visibilité du menu et renvoyez le téléchargement sous forme d'élément Web.

  document.querySelector(`#docs-file-menu`).className = 'menu-button goog-control goog- 
  inline-block goog-control-open docs-menu-button-open-below';
  document.querySelector(`#docs-file-menu`).setAttribute('aria-expanded', 'true');
  document.querySelectorAll(`.goog-menu:not(.goog-menu-noaccel)`)[0].className = 'goog-menu goog-menu-vertical docs-material docs-menu-hide-mnemonics docs-menu-attached-button-above';
  document.querySelectorAll(`.goog-menu:not(.goog-menu-noaccel)`)[0].setAttribute('style', 'user-select: none; visibility: visible; left: 64px; top: 64px;');
  // download as
  // 2 parents above 
  document.querySelector(`[aria-label='Download as d']`).parentElement.parentElement.className = 'goog-menuitem apps-menuitem goog-submenu goog-submenu-open goog-menuitem-highlight'
  return document.querySelector(`[aria-label='Download as d']`).parentElement.parentElement;

Cliquez sur télécharger en tant que btn:

IWebElement btn = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript(btnClickJs);
btn.Click();

Sélectionnez le format:

var formatCss = document.querySelectorAll(`.goog-menu.goog-menu-noaccel`)[6].querySelectorAll(`.goog-menuitem.apps-menuitem`)
                            var format = 'injectformathere' ? 'injectformathere' : '.html'

for (let i = 0; i < formatCss.length; i++) {
   if(formatCss[i].innerText.indexOf(format)!= -1)
       return formatCss[i]    
   }
return null

Format de clic:

btn = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript(btnClickJs);
if (btn != null)
  btn.Click();
0
lastlink 20 juil. 2019 à 22:49