Série de didacticiels pratiques Selenium (1) --- Fonctionnement du navigateur

Dans cette série de didacticiels, l'auteur triera et résumera pour ses amis en se basant sur son expérience pratique dans le processus de développement des tests automatisés Selenium pendant de nombreuses années, et fournira un didacticiel très pratique. Dans le même temps, les amis sont les bienvenus pour signaler les lacunes du tutoriel, apprendre ensemble et progresser ensemble. Sans plus tarder, passons directement à la première section du tutoriel : le fonctionnement du navigateur.

Le fonctionnement du navigateur peut être considéré comme l'un des contenus les plus élémentaires du développement automatisé à l'aide de Selenium.L'exécution de tout cas d'utilisation est indissociable du fonctionnement du navigateur, car le principe de Selenium est de contrôler et d'exploiter le navigateur via code, de sorte que Pour atteindre l'objectif de simuler l'exécution de cas de test sur le navigateur.

1. Ouvrir et fermer le navigateur

Navigateur ouvert

Pour tout cas de test, une entité de navigateur doit être ouverte avant que les opérations suivantes puissent être effectuées. A noter que le Webdriver correspondant au navigateur doit être préalablement installé.

require 'selenium-webdriver'
# chrome
dr = Selenium::WebDriver.for :chrome
# firefox
dr = Selenium::WebDriver.for :ff
# ie
dr = Selenium::WebDriver.for :ie

Mode sans tête

Dans certains scénarios, les ingénieurs de test doivent effectuer des tests automatisés sans ouvrir de navigateur, c'est-à-dire exécuter des tests automatisés sans tête. Chrome, le navigateur le plus populaire au monde, prend déjà en charge le mode sans tête dans Chrome 59 (Chrome 60 pour Windows), et il peut être réalisé en configurant quelques paramètres simples.

require 'selenium-webdriver'

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--remote-debugging-port=9222')
driver = Selenium::WebDriver.for :chrome, options: options

driver.get "https://www.acitve.com"
driver.save_screenshot("#{File.dirname(__FILE__)}/#{Time.now.strftime("%F")}")

fermer le navigateur

Après avoir effectué l'opération, le navigateur doit être fermé. Il existe deux manières de fermer le navigateur :

close()

require 'selenium-webdriver'

dr = Selenium::WebDriver.for :chrome
sleep 5
puts '浏览器将被关闭'
dr.close()
puts '浏览器已经关闭'

quit()

require 'selenium-webdriver'

dr = Selenium::WebDriver.for :chrome
sleep 5
puts '浏览器将被关闭'
dr.quit()
puts '浏览器已经关闭'

La différence entre les deux méthodes :

méthode la différence
fermer fermer la fenêtre actuelle du navigateur
arrêter Non seulement fermez la fenêtre, mais quittez également complètement le pilote Web, libérant ainsi la connexion avec le serveur du pilote

2. Définir la taille de la fenêtre du navigateur

Lors de l'exécution du cas d'utilisation, la taille de la fenêtre peut devoir être ajustée pour répondre aux exigences du test, car la disposition de la page s'affichera différemment selon la taille de la fenêtre du navigateur. Les paramètres couramment utilisés sont principalement :

maximiser la fenêtre

require 'selenium-webdriver'

dr = Selenium::WebDriver.for :chrome
dr.maximize_window()

taille de fenêtre personnalisée

require 'selenium-webdriver'

dr = Selenium::WebDriver.for :chrome
dr.set_window_size(240, 320)

En définissant différentes tailles de fenêtre, vous pouvez simuler l'affichage de la page dans différents scénarios sur le navigateur. Par exemple, si vous définissez une résolution mobile, vous pouvez voir si l'affichage de la page sur le terminal mobile répond aux attentes.

3. Ouvrez l'URL

Il existe deux manières d'ouvrir des URL dans Selenium :

require 'selenium-webdriver'
dr = Selenium::WebDriver.for :chrome
url = 'http://www.acitve.com'
puts "now access #{url}"
#方法1:
dr.get url

#方法2:
dr.navigate.to url

La différence entre ces deux méthodes est la suivante :

méthode différence 1 différence 2
get Attendez la fin du chargement de la page Impossible d'effectuer des opérations avant et arrière
navigate.to N'attendra pas la fin du chargement de la page L'historique de navigation peut être conservé et des opérations d'actualisation avant et arrière peuvent être effectuées

4. Imprimer le titre et l'URL de la page en cours

Cette fonction sera utilisée lors de la validation du titre et de l'URL de la page en cours

require 'selenium-webdriver'

dr = Selenium::WebDriver.for :chrome
url = 'http://www.acitve.com'
dr.get url
puts "The Title of current page is #{dr.title}"
puts "url of current page is #{dr.current_url}"

dr.quit

5. Avancer, reculer et actualiser

dr.navigateEn plus des opérations Selenium::WebDriver::Navigationmentionnées ci-dessus, les objets de la classe renvoyée peuvent également effectuer des opérations en avant, en arrière et en rafraîchissement.to

require 'selenium-webdriver'

dr = Selenium::WebDriver.for :chrome
url1 = 'http://www.acitve.com'
dr.navigate.to url
url2 = 'http://www.acitve.com/contactus'
dr.navigate.to url
puts "url of current page is #{dr.current_url}" #'http://www.acitve.com/contactus'

#返回
dr.navigate.back()
puts "url of current page is #{dr.current_url}" #'http://www.acitve.com'

#前进
dr.navigate.forward()
puts "url of current page is #{dr.current_url}" #'http://www.acitve.com/contactus'

#刷新
dr.navigate.refresh()
puts "url of current page is #{dr.current_url}" #'http://www.acitve.com/contactus'

6. Réglez l'attente

Il existe deux types d'attentes dans Selenium : les attentes implicites et les attentes explicites.

  • Attente implicite : Définissez le temps d'attente pour localiser les éléments d'interface. Lorsque le temps d'attente dépasse la valeur définie, NoSuchElementune exception est levée.
# 如果3s内还定位不到则抛出异常
driver.manage.timeouts.implicit_wait = 3 # seconds
复制代码
  • Attente explicite : via Selenium::WebDriver::Waitl'objet, définissez une condition d'attente, continuez à exécuter lorsque la condition est remplie et déclenchez une exception si le délai d'attente est dépassé.
wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds 
wait.until { dr.find_element(class: 'label').displayed? }

7. Changer de fenêtre

Il peut y avoir de nouvelles fenêtres ouvertes pendant le test, de sorte que plusieurs fenêtres apparaissent en même temps. Selenium fournit une méthode pour basculer entre plusieurs fenêtres.

  • window_handleC'est Selenium::WebDriver::Driverune méthode de la classe, retournant le handle de la fenêtre courante.

  • window_handlesC'est Selenium::WebDriver::Driverune méthode de la classe, retournant le tableau de handles de toutes les fenêtres.

  • switch_to.window(window_handle)Réaliser le saut à la fenêtre du window_handle spécifié

require 'selenium-webdriver'

dr = Selenium::WebDriver.for :chrome
dr.get 'http://the-internet.herokuapp.com/windows'
dr.find_element(css: '.example a').click

windows_array = dr.window_handles
puts "All windows are #{windows_array}"

dr.switch_to.window(windows_array.first)
puts "Current window is #{dr.window_handle}"

dr.switch_to.window(@driver.window_handles.last)
puts "Current window is #{dr.window_handle}"

8. Exécutez JavaScript

Dans le processus de développement des tests automatisés Selenium, de nombreuses fonctions de contrôle complexes ne peuvent pas être fournies ou résolues par l'API native, ce qui nécessite l'implémentation de JavaScript pour aider. Selenium fournit également une interface permettant aux développeurs d'exécuter des scripts JS dans des scripts. L'exemple suivant montrera comment utiliser JS pour réaliser la mise en évidence des éléments d'opération.

# coding: utf-8
require 'selenium-webdriver'

def highlight(element, duration = 3)

  # 保留元素原有的style,以待方法执行完成后恢复
  original_style = element.attribute("style")

  # 给元素加一个红色的虚线边界
  $driver.execute_script(
    "arguments[0].setAttribute(arguments[1], arguments[2])",
    element,
    "style",
    "border: 2px solid red; border-style: dashed;")

  # 让元素的边界保留一段时间再恢复
  if duration > 0
    sleep duration
    $driver.execute_script(
      "arguments[0].setAttribute(arguments[1], arguments[2])",
      element,
      "style",
      original_style)
  end
end

begin
    $driver = Selenium::WebDriver.for :firefox
    $driver.get 'https://www.jianshu.com'
    highlight $driver.find_element(xpath: "//a[@class='logo']")
ensure
    $driver.quit
end

De nombreuses fonctions complexes peuvent également être réalisées en utilisant JS, que je présenterai dans les tutoriels suivants.

9. Gestion des cookies

Pour le test automatisé de l'interface utilisateur Web, le traitement des cookies est un scénario relativement courant. Selenium fournit une interface complète aux développeurs pour gérer les cookies.

  • Obtenir le cookie : obtenir tous les cookies all_cookieset obtenir le cookie spécifiécookie(name)
  • Ajouter des cookies :add_cookie(name: 'token', value: 'xxxxxx')
  • Supprimer les cookies : supprimer tous les cookies delete_all_cookieset supprimer les cookies spécifiésdelete_cookie(name)
#encoding: utf-8
require 'selenium-webdriver'

dr = Selenium::WebDriver.for :chrome
url = 'http://www.acitve.com'
dr.get url

dr.manage.all_cookies
dr.manage.delete_all_cookies

#通过添加鉴权所需的cookie,可以完成登录的效果
dr.manage.add_cookie(name: 'userid', value: 'xxxxxx')
dr.manage.add_cookie(name: 'token', value: 'xxxxxx')

dr.get url

#删除一个鉴权需要的cookie后,登录将失效
dr.manage.delete_cookie('token')
dr.get url

dr.quit()

10. Définir le proxy

Dans le processus d'automatisation de l'interface utilisateur, il est assez courant d'utiliser un proxy pour accéder à la page. Dans Selenium, la configuration du proxy pour le navigateur est principalement réalisée en définissant le profil.

require 'selenium-webdriver'
PROXY = 'localhost:8087'
profile = Selenium::WebDriver::Firefox::Profile.new
profile.proxy = Selenium::WebDriver::Proxy.new( 
    :http     => PROXY,  
    :ftp      => PROXY,  
    :ssl      => PROXY)
driver = Selenium::WebDriver.for :firefox, :profile => profile

Je suppose que tu aimes

Origine blog.csdn.net/nhb687095/article/details/130427425
conseillé
Classement