WebDriver ouvrir un nouvel onglet

j'ai exploré le web et L'API WebDriver. Je ne vois pas comment ouvrir de nouveaux onglets en utilisant WebDriver/Selenium2.0 .

Quelqu'un peut-il confirmer si j'ai raison?

Merci, Chris. P. S: l'alternative actuelle que je vois est de charger des urls différentes dans la même fenêtre ou d'ouvrir de nouvelles fenêtres.

24
demandé sur ChrisOdney 2011-06-21 11:47:02
la source

18 ответов

il y a tout à fait un moyen de faire cela en utilisant webdriver, ceux qui disent que vous ne pouvez pas être juste trop paresseux. Tout d'abord, vous devez utiliser WebDriver pour injecter et ancrer tag dans la page qui ouvre l'onglet que vous voulez. Voici comment je le fais (note: driver est une instance de WebDriver):

/**
 * Executes a script on an element
 * @note Really should only be used when the web driver is sucking at exposing
 * functionality natively
 * @param script The script to execute
 * @param element The target of the script, referenced as arguments[0]
 */
public void trigger(String script, WebElement element) {
    ((JavascriptExecutor)driver).executeScript(script, element);
}

/** Executes a script
 * @note Really should only be used when the web driver is sucking at exposing
 * functionality natively
 * @param script The script to execute
 */
public Object trigger(String script) {
    return ((JavascriptExecutor)driver).executeScript(script);
}

/**
 * Opens a new tab for the given URL
 * @param url The URL to 
 * @throws JavaScriptException If unable to open tab
 */
public void openTab(String url) {
    String script = "var d=document,a=d.createElement('a');a.target='_blank';a.href='%s';a.innerHTML='.';d.body.appendChild(a);return a";
    Object element = trigger(String.format(script, url));
    if (element instanceof WebElement) {
        WebElement anchor = (WebElement) element; anchor.click();
        trigger("var a=arguments[0];a.parentNode.removeChild(a);", anchor);
    } else {
        throw new JavaScriptException(element, "Unable to open tab", 1);
    }       
}

ensuite, vous devez dire à webdriver de basculer son gestionnaire de fenêtre actuel sur le nouvel onglet. Voici comment je fais:

/**
 * Switches to the non-current window
 */
public void switchWindow() throws NoSuchWindowException, NoSuchWindowException {
    Set<String> handles = driver.getWindowHandles();
    String current = driver.getWindowHandle();
    handles.remove(current);
    String newTab = handles.iterator().next();
    locator.window(newTab);
}

Après cela, vous pouvez alors interagir avec des éléments en le nouveau contexte de page utilisant la même instance WebDriver. Une fois que vous avez terminé avec cet onglet, vous pouvez toujours revenir au contexte de fenêtre par défaut en utilisant un mécanisme similaire à la fonction switchWindow ci-dessus. Je vais laisser ça comme un exercice pour vous de comprendre.

35
répondu Jonathan Azoff 2012-02-03 05:12:53
la source

L'API de WebDriver Selenium ne supporte pas la gestion des onglets dans le navigateur à l'heure actuelle.

30
répondu JimEvans 2011-06-22 22:20:43
la source
        var windowHandles = webDriver.WindowHandles;
        var script = string.Format("window.open('{0}', '_blank');", url);
        scriptExecutor.ExecuteScript(script);
        var newWindowHandles = webDriver.WindowHandles;
        var openedWindowHandle = newWindowHandles.Except(windowHandles).Single();
        webDriver.SwitchTo().Window(openedWindowHandle);
8
répondu user2283070 2013-04-15 19:05:30
la source

j'ai eu le même problème et trouvé une réponse. Essayez de donner une.

Robot r = new Robot(); 
r.keyPress(KeyEvent.VK_CONTROL); 
r.keyPress(KeyEvent.VK_T); 
r.keyRelease(KeyEvent.VK_CONTROL); 
r.keyRelease(KeyEvent.VK_T);

Il va ouvrir un nouvel onglet, vous pouvez effectuer vos actions dans le nouvel onglet.

4
répondu deactivate 2012-11-30 18:43:19
la source

bien qu'il n'y ait pas D'API pour ouvrir un nouvel onglet, vous pouvez simplement créer une nouvelle instance de WebDriver en l'appelant quelque chose de légèrement différent et en passant L'URL que vous voulez dans le nouvel onglet. Une fois que vous avez fait tout ce que vous avez à faire, fermez cet onglet et désactivez le nouveau pilote pour qu'il n'interfère pas avec L'instance originale de Webdriver. Si vous avez besoin des deux onglets ouverts, assurez-vous de vous référer à L'instance appropriée de WebDriver. Utilisé pour Sitecore CMS automation et il a fonctionné.

1
répondu Ola Ajibode 2011-12-05 13:26:33
la source

Merci pour la grande idée @Jonathan Azoff !

Voici comment je l'ai fait en Ruby:

def open_new_window(url)
  a = @driver.execute_script("var d=document,a=d.createElement('a');a.target='_blank';a.href=arguments[0];a.innerHTML='.';d.body.appendChild(a);return a", url)
  a.click
  @driver.switch_to.window(@driver.window_handles.last)
end
1
répondu bbbco 2012-03-31 00:15:05
la source

il n'y a aucun moyen de créer de nouveaux onglets ou de gérer les onglets en utilisant web driver / selenium 2.0

Vous pouvez ouvrir dans une nouvelle fenêtre.

1
répondu Mayur Shah 2012-07-22 23:48:51
la source

Hey @Paul et qui est toujours d'avoir question de l'ouverture d'un deuxième onglet en python. Voici la solution

Je ne suis pas sûr qu'il s'agisse d'un bug dans le webdriver ou parce qu'il n'est pas encore compatible avec mutlitab mais il agit certainement de manière incorrecte avec lui et je vais montrer comment le corriger.

Question: je vois bien plus d'un problème.

premier numéro a faire que lorsque vous ouvrez un 2ème onglet, vous pouvez voir une poignée au lieu de deux.

2ème question et voici où ma solution entre en jeu. Il semble que bien que la valeur de la poignée soit encore stockée dans le pilote, la fenêtre a perdu sa synchronisation avec elle pour une raison.

Voici la solution en réglant le 2e numéro:

elem = browser.find_element_by_xpath("/html/body/div[2]/div[4]/div/a") #href link
time.sleep(2) 
elem.send_keys(Keys.CONTROL + Keys.RETURN + "2") #Will open a second tab

#solution for the 2nd issue is here    
for handle in browser.window_handles:
        print "Handle is:" + str(handle) #only one handle number
        browser.switch_to_window(handle)

time.sleep(3)

#Switch the frame over. Even if you have switched it before you need to do it again
browser.switch_to_frame("Frame") 


"""now this is how you handle closing the tab and working again with the original tab"""

#again switch window over
elem.send_keys(Keys.CONTROL + "w")
for handle in browser.window_handles:
    print "HandleAgain is:" + str(handle) #same handle number as before
    browser.switch_to_window(handle)

#again switch frame over if you are working with one
browser.switch_to_frame("Frame") 

time.sleep(3)
#doing a second round/tab
elem = browser.find_element_by_xpath("/html/body/div[2]/div[4]/div/a") #href link
time.sleep(2) 
elem.send_keys(Keys.CONTROL + Keys.RETURN + "2") #open a 2nd tab again

"""Got it? find the handle, switch over the window then switch the frame"""

Il fonctionne parfaitement pour moi. Je suis ouvert aux questions...

1
répondu Khaled Nakawa 2013-04-29 19:27:18
la source

Faire

_webDriver.SwitchTo().Window(_webDriver.WindowHandles.Where(x => x != _webDriver.CurrentWindowHandle).First());

ou Last () etc.

PS il n'y a aucune garantie que les WindowHandles sont dans l'ordre affiché sur votre navigateur, par conséquent, je vous conseille de garder un peu d'histoire de windows actuel avant de faire la commande qui a causé un nouvel onglet à ouvrir. Ensuite, vous pouvez comparer vos poignées de fenêtre stockées avec le jeu courant et passer à la nouvelle dans la liste, dont, il ne devrait y avoir qu'un seul.

1
répondu kernowcode 2014-04-03 13:05:40
la source

je dois dire que j'ai essayé cela aussi, et bien que cela fonctionne apparemment avec certaines fixations (Java, pour autant que Jonathan le dise, et ruby aussi, apparemment), avec d'autres cela ne fonctionne pas: les fixations Python de sélénium rapportent juste une poignée par fenêtre, même si elles contiennent plusieurs onglets

0
répondu Pa_ 2012-02-15 23:46:04
la source

IJavaScriptExecutor est une classe très utile qui peut manipuler le DOM HTML sur le temps d'exécution par JavaScript, voici un exemple de code sur la façon d'ouvrir un nouvel onglet de navigateur dans le sélénium par IJavaScriptExecutor:

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
                object linkObj = js.ExecuteScript("var link = document.createElement('a');link.target='_blank';link.href='http://www.gmail.com';link.innerHTML='Click Me';document.getElementById('social').appendChild(link);return link");
                /*IWebElement link = (IWebElement)linkObj;
                link.Click();*/
                browser.Click("//*[@id='social']/a[3]");

juste pour donner un aperçu, il n'y a aucune méthode dans le sélénium qui vous permettrait d'ouvrir un nouvel onglet, le code ci-dessus créerait dynamiquement un élément ancre et le dirigerait ouvrir un nouvel onglet.

0
répondu Anand 2012-11-29 11:27:54
la source

vous pouvez essayer de cette façon, puisqu'il y a action_chain dans le nouveau webdriver. J'utilise Python, donc s'il vous plaît ignorez la grammaire:

act = ActionChains(driver)
act.key_down(Keys.CONTROL)
act.click(link).perform()
act.key_up(Keys.CONTROL)
0
répondu Li Liu 2013-06-05 19:20:22
la source

Pour MAC OS

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://google.com")
body = driver.find_element_by_tag_name("body")
body.send_keys(Keys.COMMAND + 't')
0
répondu Md. Nazmul Haque Sarker 2014-02-13 14:10:54
la source

Java Robot peut être utilisé pour envoyer Ctrl+t (ou Cmd+t Si MAC OS X) comme suit:

int vkControl = IS_OS_MAC ? KeyEvent.VK_META : KeyEvent.VK_CONTROL;
Robot robot = new Robot();
robot.keyPress(vkControl);
robot.keyPress(KeyEvent.VK_T);
robot.keyRelease(vkControl);
robot.keyRelease(KeyEvent.VK_T);

un exemple d'exécution complet utilisant Chrome comme navigateur peut être bifurqué ici.

0
répondu Boni García 2016-12-01 14:07:21
la source
@Test
 public void openTab() {
  //Open tab 2 using CTRL + t keys.
  driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");


 //Open URL In 2nd tab.
  driver.get("http://www.qaautomated.com/p/contact.html");

  //Call switchToTab() method to switch to 1st tab
  switchToTab(); 
}

public void switchToTab() {
  //Switching between tabs using CTRL + tab keys.
  driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
  //Switch to current selected tab's content.
  driver.switchTo().defaultContent();  
 } 

nous pouvons utiliser des évènements clavier et automatiser l'ouverture et la commutation entre plusieurs onglets très facilement. Cet exemple est référencé ICI

0
répondu anuja jain 2017-01-11 11:19:42
la source

je préférerais ouvrir une nouvelle fenêtre. Y a-t-il vraiment une différence entre ouvrir une nouvelle fenêtre et ouvrir un nouvel onglet du point de vue de la solution automatisée ?

Vous pouvez modifier la propriété cible des ancres et une fois cliqué la page cible s'ouvrira dans une nouvelle fenêtre.

alors utilisez driver.switchTo() pour passer à la nouvelle fenêtre. L'utiliser pour résoudre votre problème

0
répondu Shrikant Khadilkar 2017-08-31 11:04:42
la source

au lieu d'ouvrir un nouvel onglet, vous pouvez ouvrir une nouvelle fenêtre en utilisant le code ci-dessous.

for(String childTab : driver.getWindowHandles())
    {
        driver.switchTo().window(childTab);
    }
-1
répondu bugCracker 2013-06-14 10:51:15
la source
package automationexamples;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openqa.selenium.WebDriver;

/**
 *
 * @author Nadir
 */

  public class NavigateExample {

  private WebDriver driver;
  public static final int OPEN_IN_NEW_TAB=1;

  NavigateExample(WebDriver driver){
  if(driver!=null)
  this.driver = driver;
  else System.out.println("Driver is NULL (Not initialized)");
  }
  public void navigateUrls(String[] URLS)
  {
  for(String URL:URLS) showURL(URL);
  }

  private void showURL(String URL)
  {
  driver.get(URL);
  }

  void navigateUrls(String[] URLS, int OPTION) {
  for(int i=0;i<URLS.length;i++) 
  {
  if(i>0)showURL(URLS[i],OPTION);
  else showURL(URLS[i]);
  } 
  }

  private void showURL(String URL, int OPTION) {

  if(OPTION==OPEN_IN_NEW_TAB)
  {
  createTAB();
  switchToNewTAB();
  }

  showURL(URL);


  }



  private void createTAB() {
  try {
  Robot r = new Robot();
  r.keyPress(KeyEvent.VK_CONTROL);
  r.keyPress(KeyEvent.VK_T);
  r.keyRelease(KeyEvent.VK_CONTROL);
  r.keyRelease(KeyEvent.VK_T); 

  } catch (AWTException ex) {
  Logger.getLogger(NavigateExample.class.getName()).log(Level.SEVERE, null, ex);
  }
  }

  private void switchToNewTAB() {
  Set set=driver.getWindowHandles();
  for(Iterator<String> it=set.iterator();it.hasNext();) 
  if(it.hasNext()) driver.switchTo().window(it.next());
  }
}
-1
répondu Nadir Laskar 2016-10-15 10:04:41
la source