WebDriver abrir nova guia

Eu pesquisei a web e a API do WebDriver. Eu não vejo uma maneira de abrir novas abas usando WebDriver / Selenium2.0.

Alguém pode por favor confirmar se estou certo?

Obrigado, Chris. PS: A alternativa atual que vejo é carregar urls diferentes na mesma janela ou abrir novas janelas.

Existe uma maneira totalmente cross-browser para fazer isso usando o webdriver, aqueles que dizem que você não pode são apenas com preguiça. Primeiro, você precisa usar o WebDriver para injetar e ancorar a tag na página que abre a guia desejada. Aqui está como eu faço isso (note: o driver é uma instância do 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); } } 

Em seguida, você precisa informar ao webdriver para alternar seu identificador de janela atual para a nova guia. Aqui está como eu faço isso:

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

Depois disso, você pode interagir com elementos no novo contexto da página usando a mesma instância do WebDriver. Depois de concluir essa guia, você sempre pode retornar ao contexto da janela padrão usando um mecanismo semelhante à function switchWindow acima. Vou deixar isso como um exercício para você descobrir.

A Selenium WebDriver API não suporta o gerenciamento de guias no navegador no momento.

  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); 

Eu tive o mesmo problema e encontrei uma resposta. Experimente.

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

Ele irá abrir uma nova aba que você pode realizar suas ações na nova aba.

Embora não haja API para abrir uma nova guia, você pode criar uma nova instância do WebDriver chamando-a de algo ligeiramente diferente e passando o URL desejado na nova guia. Depois de ter feito tudo o que você precisa fazer, feche essa guia e torne o novo driver NULL para que ele não interfira na instância original do Webdriver. Se você precisar das duas guias abertas, certifique-se de consultar a instância apropriada do WebDriver. Usado isso para automação Sitecore CMS e funcionou.

Obrigado pela ótima ideia @Jonathan Azoff!

Aqui está como eu fiz em 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 

Não há como criar uma nova guia ou manipular guias usando o driver da web / selenium 2.0

Você pode abrir uma nova janela.

Hey @Paul e quem já está tendo problema em abrir uma segunda aba em python. Aqui está a solução

Não tenho certeza se isso é um bug dentro do webdriver ou porque ele ainda não é compatível com o mutlitab, mas está definitivamente agindo errado com ele e mostrarei como corrigi-lo.

Problema: bem, vejo mais de um problema.

Primeiro problema tem que fazer isso quando você abre uma segunda aba, você só pode ver uma alça em vez de dois.

2ª edição e aqui é onde entra a minha solução. Parece que, embora o valor do identificador ainda esteja armazenado no driver, a janela perdeu a sincronia com ele por motivo.

Aqui está a solução, fixando a segunda questão:

 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""" 

Está funcionando perfeitamente para mim. Estou aberto a perguntas …

Faça isso

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

ou último () etc.

PS não há garantia de que o WindowHandles estão na ordem exibida no seu navegador, portanto, eu aconselho que você mantenha algum histórico das janelas atuais antes de fazer o comando para que causou uma nova aba para abrir. Então você pode comparar suas alças de janela armazenadas com o conjunto atual e mudar para o novo na lista, dos quais, deve haver apenas um.

Devo dizer que eu tentei isso também, e embora aparentemente funcione com alguns bindings (Java, tanto quanto Jonathan diz, e ruby ​​também, aparentemente), com outros ele não: ligações de selenium python relatam apenas um identificador por janela, mesmo se contendo várias guias

IJavaScriptExecutor é uma class muito útil que pode manipular HTML DOM em tempo de execução através de JavaScript, abaixo está um exemplo de código sobre como abrir uma nova guia do navegador no Selenium através de 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]"); 

Só para dar uma ideia, não há methods no Selenium que permitam abrir uma nova aba, o código acima criaria dinamicamente um elemento de âncora e o direcionaria a abrir uma nova aba.

Você pode tentar desta forma, já que há action_chain no novo webdriver. Estou usando o Python, então, por favor, ignore a gramática:

 act = ActionChains(driver) act.key_down(Keys.CONTROL) act.click(link).perform() act.key_up(Keys.CONTROL) 

Para o 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') 

O Java Robot pode ser usado para enviar Ctrl + t (ou Cmd + t se o MAC OS X) da seguinte forma:

 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); 

Um exemplo completo de execução usando o Chrome como navegador pode ser bifurcado aqui .

 @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(); } 

podemos usar events de teclado e automatizar a abertura e alternar entre várias guias com muita facilidade. Este exemplo é referido AQUI

Eu preferiria abrir uma nova janela. Existe realmente uma diferença em abrir uma nova janela ao abrir uma nova guia a partir de uma perspectiva de solução automatizada?

você pode modificar a propriedade de destino de âncoras e, uma vez clicada, a página de destino abriria em uma nova janela.

Em seguida, use driver.switchTo() para mudar para a nova janela. Use-o para resolver seu problema

Em vez de abrir uma nova guia, você pode abrir uma nova janela usando o código abaixo.

 for(String childTab : driver.getWindowHandles()) { driver.switchTo().window(childTab); } 
 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;i0)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 it=set.iterator();it.hasNext();) if(it.hasNext()) driver.switchTo().window(it.next()); } }