2017-08-02 1 views
0

J'essaie d'utiliser Selenium avec WebDriver et le Page Object Pattern pour ouvrir des liens dans une table. Je n'ai aucun contrôle sur le code de la page Web.Comment cliquer sur un lien spécifique dans une TableCell avec plusieurs liens en utilisant Selenium WebDriver et Page Object Pattern?

Veuillez également noter que ceci est un exemple simplifié mais cela fonctionne et montre le problème.

Code du travail: https://gist.github.com/charlesgreen/b80ed7e164b7199eaa44229e104f4428

La table a une colonne avec 1 ou 2 liens dans une seule cellule.

Pour les cellules avec seulement 1 lien, je suis capable d'ouvrir le lien en appelant .link_element.click sur la cellule.

Pour les cellules avec 2 liens, cela ouvre le premier lien dans la cellule mais j'essaie d'ouvrir le deuxième lien (faits). Est-il possible de cliquer uniquement sur le lien Faits dans la cellule (c'est-à-dire, index ou itération)?

Note: Le site original, je travaille avec les deux liens ouverts mais je suis incapable de reproduire le problème localement Ceci étant dit, ce n'est pas mon objectif. J'essaie d'ouvrir le deuxième lien. Ceci est reproductible dans le code ci-dessous avec le lien gist ci-dessus.

# products.rb 
require 'selenium-webdriver' 
require './product_page' 

Selenium::WebDriver.logger.output = 'selenium.log' 
Selenium::WebDriver::Chrome.driver_path = '/Applications/chromedriver' 
browser = Selenium::WebDriver.for :chrome 

# UPDATE File path 
browser.get('file:///Users/name/products/index.html') 

product_page = ProductPage.new(browser) 
product_page.open_facts_link 


# product_page.rb 
require 'page-object' 

class ProductPage 
    include PageObject 
    table(:products, id: 'products') 

    def open_facts_link 
     products_element[2][0].link_element.click 
    end 
end 


# index.html - validated with https://validator.nu/ 
<!DOCTYPE html> 
<head> 
    <title>Link Page</title> 
    <script> 
     function OpenPhotos(val) { 
      var opened = window.open(""); 
      opened.document.write("<html><head><title>Photos</title></head><body>Photos</body></html>"); 
     } 

     function OpenFacts(val) { 
      var opened = window.open(""); 
      opened.document.write("<html><head><title>Facts</title></head><body>Facts</body></html>"); 
     } 
    </script> 
</head> 
<body> 
    <table id="products"> 
     <tr> 
      <th>Links</th> 
      <th>Description</th> 
     </tr> 
     <tr> 
      <td> 
       <ul> 
        <li> 
         <a id="A_35" href="javascript:OpenFacts('35')" target="_blank">Facts</a> 
        </li> 
       </ul> 
      </td> 
      <td>Product 1</td> 
     </tr> 
     <tr> 
      <td> 
       <ul> 
        <li> 
         <a id="A_36" href="javascript:OpenPhotos('36')" target="_blank">Photos</a> 
        </li> 
        <li> 
         <a id="L_36" href="javascript:OpenFacts('36')" target="_blank">Facts</a> 
        </li> 
       </ul> 
      </td> 
      <td>Product 2</td> 
     </tr> 
    </table> 
</body> 
+0

OMI, tout en créant le pseudo HTML pour référence accidentellement l'unicité de 'id' se sont perdus dans' 'Facts DebanjanB

+0

C'est un peu inhabituel un appel 'click' déclencherait 2 liens différents. Pouvez-vous créer un scénario de test reproductible (c.-à-d. Le code HTML et le code objet de la page)? L'exemple actuel semble être trop simplifié car je suis incapable de reproduire le problème et il génère des exceptions. –

+0

@DebanjanB je vous remercie pour la note. J'ai corrigé l'identifiant. –

Répondre

0

à cliquer sur les différents liens dans la même cellule, vous pouvez passer un localisateur link_element pour être plus précis. Dans ce cas, vous pouvez utiliser l'attribut href pour différencier les 2 liens:

# Click Facts link 
products_element[2][0].link_element(href: /OpenFacts/).click 

# Click Photos link 
products_element[2][0].link_element(href: /OpenPhotos/).click 
+0

Merci @JustinKo pour toute votre aide. –