[PYTHON] Prise en charge de Flash Selenium
Objectif
- Je souhaite tester automatiquement l'interface utilisateur d'un site créé avec Adobe Flash.
- http://www.adobe.com/jp/products/flashplayer.html
- Principalement cliquez, faites glisser et déposez, double-cliquez, etc.
problème
- Test automatique du navigateur Web = Sélectionnez Selenium Python avec l'idée simple d'utiliser Selenium.
- Cependant, puisque Flash est considéré comme un objet en HTML, il n'y a aucun moyen de spécifier son élément enfant dans Selenium.
Solution
procédure
- La méthode de mise en œuvre sera expliquée en utilisant le jeu Flash Fleet Collection comme exemple.
- Cette fois, c'est juste par exemple, et vous ne devriez pas aller au jeu réel.
- Obtenez la capture d'écran de l'écran avec Selenium.
- Obtenez la position de coordonnées cible (x, y) à partir de l'image de référence préparée à l'avance à l'aide de la mise en correspondance des modèles à l'aide d'OpenCV.
- Spécifiez l'élément HTML de référence (cette fois le logo de l'entreprise)
- Comparez la distance entre l'élément HTML spécifié et la position de coordonnées cible, déterminez la valeur de décalage et exécutez en utilisant la méthode précédente.
la mise en oeuvre
-
Cette fois, nous n'implémenterons qu'une simple opération Click.
-
Puisque le Drag & Drop et le Double Click sont également implémentés dans l'API Selenium Python, il peut être possible de le mettre en pratique en appliquant cette méthode. Je ne le ferai pas car c'est gênant.
-
Cette fois, le processus de démarrage de la correspondance des navigateurs et des modèles par OpenCV est omis et l'implémentation concerne uniquement l'étape 3 à 4. Pour les autres méthodes d'implémentation, veuillez consulter chaque site Web.
click.py
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
class Browser(object):
...
def click(self, element, x, y):
"""
element : Target HTML Element
x : offset_x
y : offset_y
"""
self.driver = webdriver.Firefox()
target = self.driver.find_element_by_id(element)
off_x = int(target.size["width"]) / 2
off_y = int(target.size["height"]) / 2
actions = ActionChains(self.driver)
actions.move_to_element(target)
actions.move_by_offset(x - off_x, y - off_y)
actions.click()
actions.move_to_element(target)
actions.perform()
...
- Une série d'actions sont enregistrées et exécutées à l'aide d'ActionChains.
- Lorsque Element est spécifié, il semble que la spécification est de cliquer sur le centre de Element, alors effectuez des ajustements précis.
- La raison pour laquelle nous passons à nouveau au dernier élément spécifié est que si nous le laissons tel quel, il peut obtenir un jugement MouseOver.
Conclusion
- Je pense qu'il existe un moyen de faciliter les choses.