web-dev-qa-db-ja.com

WebDriverが新しいタブを開く

WebとWebDriver APIをトロールしました。 WebDriver/Selenium2.0を使用して新しいタブを開く方法がわかりません。

私が正しいかどうかを誰かが確認できますか?

ありがとう、クリス。追伸:私が見る現在の代替案は、同じウィンドウに異なるURLをロードするか、新しいウィンドウを開くことです。

24
ChrisOdney

Webdriverを使用してこれを行うクロスブラウザーの方法はまったくあります。まず、WebDriverを使用して、目的のタブを開くページにタグを挿入およびアンカーする必要があります。方法は次のとおりです(注:ドライバーは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);
    }       
}

次に、現在のウィンドウハンドルを新しいタブに切り替えるようwebdriverに指示する必要があります。以下がその方法です。

/**
 * 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);
}

これが完了したら、同じWebDriverインスタンスを使用して、新しいページコンテキストの要素を操作できます。そのタブでの作業が完了したら、上記のswitchWindow関数と同様のメカニズムを使用して、いつでもデフォルトのウィンドウコンテキストに戻ることができます。あなたが理解するための演習としてそれを残しておきます。

35
Jonathan Azoff

現在、Selenium WebDriver APIはブラウザー内のタブの管理をサポートしていません。

30
JimEvans
        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
user2283070

私は同じ問題を抱えていて、答えを見つけました。試してみる。

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

新しいタブが開き、新しいタブでアクションを実行できます。

4
deactivate

これを行う

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

またはLast()など。

PS WindowHandlesがブラウザに表示される順序であるという保証はありません。したがって、新しいタブを開くコマンドを実行する前に、現在のウィンドウの履歴を保存することをお勧めします。次に、保存されているウィンドウハンドルを現在のセットと比較し、リスト内の新しいものに切り替えることができます。

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

キーボードイベントを使用して、複数のタブの開閉を簡単に自動化できます。この例は [〜#〜] here [〜#〜] から参照されています

1
anuja jain

@Jonathan Azoffの素晴らしいアイデアをありがとう!

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
bbbco

@Paulさん、そしてPythonで2番目のタブを開くときに問題を抱えている人がいます。ここに解決策があります

これがwebdriver内のバグなのか、それともmutlitabとまだ互換性がないのかはわかりませんが、間違いなく動作が間違っているので、修正方法を示します。

問題:よく複数の問題があります。

最初の問題では、2番目のタブを開いたときに、2つではなく1つのハンドルしか表示されないようにする必要があります。

2番目の問題そして、ここに私のソリューションが登場します。ハンドル値はまだドライバーに保存されていますが、ウィンドウは理由により同期が失われているようです。

2番目の問題を修正することによる解決策は次のとおりです

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

それは私にとって完璧に機能しています。質問を受け付けています...

1
Khaled Nakawa

新しいタブを開くためのAPIはありませんが、WebDriverの新しいインスタンスを作成して、わずかに異なるものを呼び出し、必要なURLを新しいタブに渡すことができます。必要な作業がすべて完了したら、そのタブを閉じて、新しいドライバーをNULLにして、Webdriverの元のインスタンスに干渉しないようにします。両方のタブを開く必要がある場合は、WebDriverの適切なインスタンスを必ず参照してください。これをSitecore CMS自動化に使用し、機能しました。

1
Ola Ajibode

Webドライバー/ Selenium 2.0を使用して新しいTABを作成したり、タブを処理したりする方法はありません

代わりに新しいウィンドウを開くことができます。

1
Mayur Shah

IJavaScriptExecutorは、JavaScriptを使用して実行時にHTML DOMを操作できる非常に便利なクラスです。以下は、IJavaScriptExecutorを使用してSeleniumで新しいブラウザタブを開く方法のサンプルコードです。

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

洞察力を与えるために、Seleniumには新しいタブを開くことができるメソッドはありません。上記のコードはアンカー要素を動的に作成し、新しいタブを開くように指示します。

0
Anand

新しいWebdriverにはaction_chainがあるため、この方法を試すことができます。私はPythonを使用していますので、文法を無視してください:

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

新しいウィンドウを開くことをお勧めします。自動化されたソリューションの観点から、新しいウィンドウを開くことと新しいタブを開くことには本当に違いがありますか?

アンカーターゲットプロパティを変更し、クリックするとターゲットページが新しいウィンドウで開きます。

次に、driver.switchTo()を使用して、新しいウィンドウに切り替えます。それを使用して問題を解決します

0

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

Java Robotを使用して、次のようにCtrl + t(またはMAC OS Xの場合はCmd + t)を送信できます。

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

Chromeを使用してブラウザを分岐できる完全な実行例 here

0
Boni García

私もこれを試したと言わなければなりません、そしてそれはいくつかのバインディングで動作するように見えますが(Java、ジョナサンが言う限り、およびRubyもそうです)、それ以外では動作しません:Selenium pythonバインディングは、複数のタブが含まれている場合でも、ウィンドウごとに1つのハンドルのみを報告します。

0
Pa_