1. Selenium の自動化
1. セレンとは何ですか?
Selenium は、Web アプリケーション用の UI ベースの自動テスト フレームワークです。
2. Seleniumの特徴は何ですか?
複数のプラットフォーム、複数のブラウザ、および複数の言語をサポートします。
3. 自動化はどのように機能しますか?
上の図から、以下で詳しく説明する 3 つの役割に気づくことができます。
- オートメーション スクリプト: Java の場合、WebDriver API を使用して作成されたテスト スクリプトです。ブラウザドライバーに送信するために使用されます。
- ブラウザ ドライバ (ブラウザ ドライバ): 各ブラウザには独自のドライバがあり、exe ファイルの形式で存在します。たとえば、Google の chromedriver.exe、Firefox の geckodriver.exe、IE の IEDriverServer.exe などです。これらの自動テストのコードを解析し、解析後にブラウザに送信します。
- ブラウザ: ブラウザは、もちろん、私たちがよく知っている一般的に使用されるさまざまなブラウザです。ブラウザドライバーから送られる指示を実行し、最終的にエンジニアが望む操作を完了します。
上の図と組み合わせると、次のことがさらに理解できます。
- Selenium スクリプトごとに http リクエストが作成され、ブラウザ ドライバーに送信されます。
- ブラウザ ドライバーには、これらの http リクエストを受信するための HTTP サーバーが含まれています。
- リクエストを受信したHTTPサーバーは、リクエストに応じて対応するブラウザを具体的に制御します。
- ブラウザは特定のテスト手順を実行します。
- ブラウザはステップの実行結果をHTTPサーバーに返します。
- HTTP サーバーは結果を Selenium スクリプトに返します。HTTP コードが正しくない場合は、コンソールに対応するエラー メッセージが表示されます。
2. Selenium自動テスト環境の設定(Java)
- クロム。ダウンロード アドレス: https://www.google.cn/intl/zh-CN/chrome/
- Chrome のドライバー (ChromeDriver)。ドライバーのバージョンは Chrome ブラウザのバージョンと一致する必要があることに注意してください。ダウンロード アドレス: https://chromedriver.chromium.org/downloads
- Selenium3 ツールキット。 Maven ウェアハウスのインポート依存関係: https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java/3.141.59
最初の Selenium デモを作成します。
public static void main(String[] args) throws InterruptedException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问百度
webDriver.get("https://www.baidu.com");
}
3. よく使用される WebDriver API の学習
1. 要素の配置
要素の配置は自動テストの中核となります。オブジェクトを操作したい場合は、まずオブジェクトを識別する必要があります。Webdriver には 2 つのタイプがあります: findElement()
と findElements()
このメソッドは、要素を配置するためにオブジェクト配置メソッドとともに使用されます。 Webdriver は、一連のオブジェクト配置メソッドを提供します: ID、名前、クラス名、リンク テキスト、部分リンク テキスト、タグ名、Xpath、CSS セレクター。実際のテストでは、主に 2 つのタイプが一般的に使用されます。
(1) CSS配置:CSSセレクター
CSS の配置は CSS セレクターに基づいており、ページ内のセレクターを検索することでページ要素のコンテンツを見つけることができます。たとえば、一般的なものには、ID セレクター: #id、クラス セレクター: .class、タグ セレクター: タグ名、子孫セレクター: 親タグと子タグなどがあります。
(2) xpath の配置: xpath
XPath は、XML ドキュメント内の要素を検索するための言語です。比較的強力な機能ですが、構文が複雑です。体系的に学習したい場合は、W3school がおすすめです。ここでは、その概要を簡単に紹介します。基本的な使い方:
絶対パスを使用して要素を検索する:
/html/head/title
式全体の意味は、ドキュメントのルート要素から開始し、その子を選択することです。要素 html を選択し、子要素 head を選択し、最後に head 要素の下にある子要素 title を選択します。相対パス + インデックス:
//form/span[1]/input
この式は、ルート ノードから開始して、「form」という名前のすべての要素を検索し、各検索で検索することを意味します。 form要素の最初のspan要素を検索し、span要素の下にあるinput要素を見つけます。この方法では、インデックスを使用して、目的の要素の正確な位置を指定します。相対パス + 属性値:
//input[@class="s_ipt"]
この XPath 式は、input という名前のすべてのタグを選択するために使用され、class 属性の値は「s_ipt」です。 " ;要素。 @ 記号は属性を参照するために使用され、その値に基づいて要素を配置できるようになります。相対パス + ワイルドカード:
//[@="su"]
この XPath 式は、ワイルドカード * を使用して、指定された文字列「su」を含む属性名を含むすべてのドキュメントを選択します。 。このメソッドを使用すると、要素に関係なく、特定の属性を持つ要素を見つけることができます。相対パス + テキストの一致:
//a[text()="新闻"]
この式は、タグ名が a でテキストの内容が「News」であるすべての要素を選択します。括弧内で text() 関数を使用して、一致させる必要があるテキストの内容を指定します。
(3) CSS 配置と xpath 配置のどちらが優れていますか?
Web 開発でスタイルとレイアウトを定義することが主なタスクである場合は、CSS セレクターがより適しています。また、複雑な XML ドキュメント処理が必要な場合や、より詳細なノードの配置が必要な場合は、XPath セレクターがより適しています。さらに、CSS セレクターは HTML ドキュメント用に特別に設計されており、ブラウザーは HTML ページの解析およびレンダリング時に CSS セレクターを効率的に最適化します。
追記: 実際のテストでは、開発者ツールを開いてページ要素を選択できます。マウスを右クリックすると、要素の css/xpath の位置をすばやく取得できます。 。
2. テストオブジェクトを操作する
click()
オブジェクトをクリックしますsendKeys()
オブジェクトに対するキー入力をシミュレートするclear()
オブジェクト内の入力をクリアしますsubmit()
オブジェクトの送信
注: クリックされた要素が form タグ内に配置されている場合、submit を使用すると click と同じ効果が得られます。クリックされた要素が非 form タグ内に配置されている場合、submit を使用するとエラーが報告されます。
public class Main {
public static void main(String[] args) throws InterruptedException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问百度
webDriver.get("https://www.baidu.com");
sleep(1000);
// 在输入框模拟键盘输入
webDriver.findElement(By.cssSelector("#kw")).sendKeys("csdn不摸鱼的程序员");
sleep(1000);
// 点击"百度一下"
webDriver.findElement(By.cssSelector("#su")).click();
sleep(1000);
// 清除输入框
webDriver.findElement(By.cssSelector("#kw")).clear();
sleep(1000);
// 点击第一条搜索结果
webDriver.findElement(By.cssSelector("#\\31 > div > div:nth-child(1) > h3 > a")).click();
}
}
結果の表示:
3.待機を追加する
(1) 強制待機
上記のコードでは sleep()
を使用しました。sleep() は強制待機であり、内部の時間パラメータに従って待機します。
(2) 暗黙的な待機
public class ImplicitlyWaitExample {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); // 设置隐式等待时间为10秒
driver.get("https://www.example.com");
// 后续操作
// ...
driver.quit();
}
}
上記の例では、driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)
を使用して暗黙的な待機時間を 10 秒に設定しています。このようにして、要素を検索するとき、またはコマンドを実行するときに、WebDriver は要素が表示されるかタイムアウトになるまで一定時間待機します。
注:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)
は、ChromeDriver インスタンスの作成後、実際のテスト手順が実行される前に配置されます。これにより、暗黙的な待機設定がテスト全体に適用され、要素が見つかるまで待機することが保証されます。暗黙的な待機は 1 回 (通常は WebDriver インスタンスの作成直後) だけ設定する必要があることに注意してください。この設定は、WebDriver インスタンスが閉じられるか、暗黙的な待機設定がクリアされるまで、テスト実行中の後続の要素の検索に有効になります。
(3) 明示的な待機
public class WebDriverWaitExample {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
driver.get("https://www.example.com");
// 使用显式等待等待元素可点击
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.id("myButton")));
button.click();
// 后续操作
// ...
driver.quit();
}
}
上の例では、WebDriverWait
と ExpectedConditions
を組み合わせて使用しました。特定の条件が揃うまで待つ発生後も実行を継続します。ここでは、要素をクリックする前に、要素がクリック可能になるのを待ちます。
4. 情報の取得
getText()
このメソッドは、Web ページ要素によって表示されるテキスト コンテンツを取得するために使用されます。これは通常、要素内に表示されるテキストを指します。getAttribute()
このメソッドは、要素の指定された属性 (ID、名前、クラスなど) の値を取得するために使用されます。
public static void main(String[] args) throws InterruptedException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问百度
webDriver.get("https://www.baidu.com");
sleep(1000);
// 获取百度词条文本
String text = webDriver.findElement(
By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();
System.out.println("元素内文本:"+text);
sleep(1000);
// 获取输入框name
String name = webDriver.findElement(By.cssSelector("#kw")).getAttribute("name");
System.out.println("元素属性 name:"+name);
}
getCurrentUrl()
このメソッドは、現在のブラウザが存在するページの URL アドレスを取得するために使用されます。
getTitle()
このメソッドは、現在のページのタイトル、つまりページ タグを取得するために使用されます ()中的文本内容。
public static void main(String[] args) throws InterruptedException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问百度
webDriver.get("https://www.baidu.com");
sleep(1000);
// 获取百度url
String url = webDriver.getCurrentUrl();
System.out.println("百度 url:"+url);
sleep(1000);
// 获取百度title
String title = webDriver.getTitle();
System.out.println("百度 title:"+title);
}
5. マウス操作
click()
クリック: リンク、ボタン、またはその他のインタラクティブな要素をクリックするために使用できる、左クリックのマウス アクションをシミュレートします。doubleClick()
ダブルクリック: マウスの左ボタンによるダブルクリック操作をシミュレートし、特定のダブルクリック操作シナリオで使用できます。contextClick()
右クリック: 右クリックのマウス操作をシミュレートし、コンテキスト メニューまたはその他の右クリック インタラクション効果をトリガーできます。moveToElement()
ホバー: 指定した要素にマウスを移動してホバーします。これを使用して、ホバー メニューまたはプロンプト情報の表示をトリガーできます。dragAndDrop()
ドラッグ アンド ドロップ: マウスのドラッグ操作をシミュレートします。通常、ドラッグ アンド ドロップのインタラクティブな効果を実現するために使用されます。
Actions クラスはユーザー インタラクション アクションを表し、Web ページ上でユーザーのマウス、キーボード、その他の操作を構築および実行するために使用されます。
public static void main(String[] args) throws InterruptedException {
// 创建浏览器驱动
WebDriver driver = new ChromeDriver();
// 访问百度
driver.get("https://www.baidu.com");
sleep(1000);
// 获取到百度一下按钮
WebElement element = driver.findElement(By.cssSelector("#su"));
// 初始化 action
Actions actions = new Actions(driver);
// 点击操作
actions.click(element).perform();
sleep(1000);
// 获取底部元素
WebElement element1 = driver.findElement(By.cssSelector("#bottom_layer > div > p:nth-child(8)"));
// 双击操作
actions.doubleClick(element1).perform();
sleep(1000);
// 获取“图片”文字
WebElement element2 = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)"));
// 右键点击操作
actions.contextClick(element2).perform();
sleep(1000);
// 获取到百度logo
WebElement element3 = driver.findElement(By.cssSelector("#lg > map > area"));
// 悬停操作
actions.moveToElement(element3).perform();
sleep(1000);
// 模拟拖放操作(从底部移动到顶部)
WebElement sourceElement = driver.findElement(By.cssSelector("#bottom_layer > div > p:nth-child(1) > a"));
WebElement targetElement = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)"));
actions.dragAndDrop(sourceElement, targetElement).perform();
sleep(1000);
actions.click().perform();
sleep(1000);
}
追記: Selenium では、perform()
メソッドを使用して、事前に定義された一連のアクションを実行します。 Actions クラスを使用して一連のマウスまたはキーボード操作を構築すると、これらの操作はすぐには実行されませんが、アクション シーケンスに組み込まれます。 Selenium は、perform() メソッドが呼び出された場合にのみ、定義された順序でこれらの操作を実行します。この設計アプローチの利点は、マウスとキーボードの複雑な操作シーケンスを構築し、それらをすべて一度に実行できることです。
6. キーボード操作
- sendKeys(Keys.TAB) // TAB
- sendKeys(Keys.ENTER) // Enter
- sendKeys(Keys.SPACE) // スペースキー
- sendKeys(Keys.ESCAPE) // 回退键(Esc)
- sendKeys(Keys.CONTROL,“a”) // すべて選択 (Ctrl+A)
- sendKeys(Keys.CONTROL,“c”) // コピー (Ctrl+C)
- sendKeys(Keys.CONTROL,“x”) // カットアンドペースト (Ctrl+X)
- sendKeys(Keys.CONTROL,“v”) // 貼り付け (Ctrl+V)
public static void main(String[] args) throws InterruptedException {
// 创建浏览器驱动
WebDriver driver = new ChromeDriver();
// 访问百度
driver.get("https://www.baidu.com");
sleep(2000);
// 获取到百度搜索框
WebElement element = driver.findElement(By.cssSelector("#kw"));
// 输入内容-》输入空格-》输入内容-》输入TAP-》输入内容-》回车键
element.sendKeys("不摸鱼");
sleep(1000);
element.sendKeys(Keys.SPACE);
sleep(1000);
element.sendKeys("的");
sleep(1000);
element.sendKeys(Keys.TAB);
sleep(1000);
element.sendKeys("程序员");
sleep(1000);
element.sendKeys(Keys.ENTER);
// 全选-》剪贴-》粘贴
element.sendKeys(Keys.CONTROL,"a");
sleep(1000);
element.sendKeys(Keys.CONTROL,"x");
sleep(1000);
element.sendKeys(Keys.CONTROL,"v");
sleep(1000);
}
7. ブラウザ操作
webDriver.navigate().forward()
: このステートメントは、ブラウザーを前方に移動させる、つまり閲覧履歴の次のページに移動させるために使用されます。webDriver.navigate().back()
: forward() とは反対に、このステートメントはブラウザを閲覧履歴の前のページに戻すために使用されます。webDriver.manage().window().maximize()
:ブラウザウィンドウを最大化する操作です。webDriver.manage().window().setSize(new Dimension(width, height))
: このステートメントは、ブラウザ ウィンドウのサイズを設定するために使用されます。必要な幅と高さのパラメータを指定して、さまざまなテスト シナリオやニーズに合わせてブラウザ ウィンドウのサイズを変更できます。window.scrollTo(0, document.body.scrollHeight)
JSスクリプト, ページの一番下までスクロールします。 (最初のパラメータは水平スクロール位置、2番目のパラメータは垂直スクロール位置です)window.scrollTo(0, 0)
JSスクリプト, ページの先頭までスクロールします。
public static void main(String[] args) throws InterruptedException {
// 创建浏览器驱动
WebDriver driver = new ChromeDriver();
// 访问百度
driver.get("https://www.baidu.com");
sleep(2000);
// 获取到百度搜索框
WebElement element = driver.findElement(By.cssSelector("#kw"));
// 搜索“软件测试”
element.sendKeys("软件测试");
sleep(1000);
element.sendKeys(Keys.ENTER);
sleep(1000);
// 返回百度首页
driver.navigate().back();
sleep(1000);
// 返回软件测试搜索页
driver.navigate().forward();
sleep(1000);
// 自定义浏览器窗口
driver.manage().window().setSize(new Dimension(500,500));
sleep(1000);
// 实现浏览器窗口最大化
driver.manage().window().maximize();
sleep(1000);
// 实现滚动到页面底部
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
sleep(1000);
// 实现滚动到页面顶部
js.executeScript("window.scrollTo(0, 0)");
sleep(1000);
}
8. ポップアップウィンドウの操作
アラートポップアップウィンドウ、確認ボックス (confirm)、プロンプトボックス (Prompt):
switchTo().alert()
: ページ上の警告ボックスに切り替え、Alert オブジェクトを返すために使用されます。このオブジェクトを使用して、警告ボックスを受け入れる、キャンセルする、または警告ボックスにテキストを入力することができます。alert.accept()
: 警告ボックスを受け入れるために使用されます (「OK」ボタンをクリックします)。alert.dismiss()
:警告ボックスをキャンセルする場合に使用します(「キャンセル」ボタンをクリック)。alert.sendKeys("your_text")
: 警告ボックスにテキストを入力するために使用されます。
以下では、プロンプト プロンプト ボックスを例として使用して説明します。
public static void main(String[] args) throws InterruptedException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问
webDriver.get("http://localhost:63342/autoTest/src/main/page/alert.html?_ijt=g52rrlh3gfrag8ivs5g3ec40c0");
sleep(1500);
// 点击弹窗按钮
webDriver.findElement(By.cssSelector("body > button")).click();
sleep(1000);
// 切换到页面上的警告框
Alert alert = webDriver.switchTo().alert();
// 点击取消
alert.dismiss();
sleep(1000);
// 再次点击按钮
webDriver.findElement(By.cssSelector("body > button")).click();
sleep(1000);
// 输入“不摸鱼”
alert = webDriver.switchTo().alert();
alert.sendKeys("不摸鱼");
sleep(1000);
// 点击确定
alert.accept();
sleep(1000);
}
9. オプションの操作
ラジオボタンの操作:
- ラジオ ボタンは WebElement オブジェクトを通じて処理されます。
click()
: ラジオ ボタンをクリックして選択します。
チェックボックスの操作:
- チェック ボックスは、WebElement オブジェクトを通じて処理されます。
click()
: クリックすると、チェックボックスのチェック状態が切り替わります。
public static void main(String[] args) throws InterruptedException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问
webDriver.get("http://localhost:63342/autoTest/src/main/page/choice.html?_ijt=fc7i1795ada371afdv81v0iqk2");
sleep(1500);
// 选择并点击2/3两个复选框
WebElement box1 = webDriver.findElement(By.cssSelector("#c2"));
box1.click();
sleep(1000);
WebElement box2 = webDriver.findElement(By.cssSelector("#c3"));
box2.click();
sleep(1000);
// 选择第二个单选框
WebElement choice = webDriver.findElement(By.cssSelector("#r2"));
choice.click();
sleep(1000);
}
10. ドロップダウンボックスの操作
Select クラスを通じてドロップダウン ボックスを処理します。
selectByVisibleText("visible_text")
: ドロップダウン オプションの表示テキストに基づいて選択を行います。selectByValue("value")
: ドロップダウン オプションの値に基づいて選択します。selectByIndex(index)
: ドロップダウン オプションのインデックスに基づいて選択します (0 から始まります)。
public static void main(String[] args) throws InterruptedException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问
webDriver.get("http://localhost:63342/autoTest/src/main/page/pulldown.html?_ijt=bjk05362bbitst3j1nrntnnrn9");
sleep(1500);
// 定位下拉框按钮
WebElement shippingMethod = webDriver.findElement(By.name("ShippingMethod"));
sleep(1000);
// 定义select对象
Select select = new Select(shippingMethod);
// 根据索引选择第3个
select.selectByIndex(2);
sleep(1000);
// 根据属性孩子选择value=11.61
select.selectByValue("11.61");
sleep(1000);
}
11. ファイルをアップロードする
WebElement.sendKeys()
: これは、ファイル パスを入力要素に送信するために使用されるメソッドです。ファイル入力要素を見つけて、sendKeys() メソッドを呼び出し、ファイルの絶対パスをパラメータとして渡して、ファイルのアップロード操作を実装します。
public static void main(String[] args) throws InterruptedException, IOException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问
webDriver.get("http://localhost:63342/autoTest/src/main/page/upload.html?_ijt=bhatof5910d1h8q6675j3jjoa5");
sleep(1500);
// 上传图片
WebElement uploadFile = webDriver.findElement(By.cssSelector("body > input[type=file]"));
uploadFile.sendKeys("D:\\博客图片\\MyBlog\\java.png");
sleep(1000);
}
12. スクリーンショット
スクリーンショット操作には、Commons-io の依存関係をインポートする必要があります: https://mvnrepository.com/artifact/commons-io/commons-io/2.11.0
次に、TakesScreenshot
インターフェースで getScreenshotAs()
メソッドを呼び出します。
public static void main(String[] args) throws InterruptedException, IOException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问
webDriver.get("https://www.baidu.com");
sleep(1500);
// 搜索“不摸鱼的程序员”
webDriver.findElement(By.cssSelector("#kw")).sendKeys("不摸鱼的程序员-csdn");
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
// 截图
File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
// 将图片保存到硬盘
FileUtils.copyFile(file, new File("D://20231111.png"));
}
13. iframe フレームの配置
Web ページで iframe が使用されている場合、フレーム内の要素を直接配置することはできません。配置操作を実行するには、まず対応する iframe に切り替える必要があります。
webDriver.switchTo().frame()
: これは、指定された iframe に切り替えるための Selenium の主なメソッドです。 、ID、またはWebElement オブジェクトを指定して、切り替え先の iframe を指定します。webDriver.switchTo().parentFrame()
: このメソッドは、iframe から上位レベルのコンテキストに戻る必要がある場合に使用できます。webDriver.switchTo().defaultContent()
: ネストされたすべての iframe から最も外側のページ コンテキストに戻る必要がある場合は、このメソッドを使用します。
public static void main(String[] args) throws InterruptedException, IOException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问
webDriver.get("http://localhost:63342/autoTest/src/main/page/iframe.html?_ijt=hiqvtbuga50aga3831ql9nu2ph");
sleep(1500);
// 切换到 iframe:f1
webDriver.switchTo().frame("f1");
// 点击内部的click
webDriver.findElement(By.cssSelector("body > div > div > a")).click();
sleep(1000);
}
14. マルチウィンドウの配置
マルチウィンドウの配置を説明する前に、まず理解しましょうウィンドウハンドル:
ウィンドウ ハンドルは、オペレーティング システム レベルでウィンドウを識別するために使用される一意の識別子です。 Selenium では、通常、ウィンドウ ハンドルはブラウザ ウィンドウまたはタブを識別するために使用され、複数のウィンドウ間で切り替えて操作できるようにします。ブラウザで新しいタブまたはウィンドウを開くと、各ウィンドウには独自のハンドルがあります。これらのハンドルを取得することで、Selenium はさまざまなウィンドウの追跡と管理に役立ち、複数のウィンドウ間の切り替え、要素の検索、操作の実行が可能になります。
Selenium は、Windows を操作するために次の API を提供します。
- 現在のウィンドウ ハンドルを取得する: driver.getWindowHandle() メソッドを使用して、現在のウィンドウのハンドルを取得します。
- すべてのウィンドウ ハンドルを取得する: driver.getWindowHandles() メソッドを使用して、開いているすべてのウィンドウのハンドルを取得します。
- ウィンドウの切り替え: driver.switchTo().window(windowHandle) メソッドを使用して、指定したウィンドウに切り替えます。
public static void main(String[] args) throws InterruptedException, IOException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问百度(注:此时窗口句柄在百度首页,webDerive的所有操作只能针对首页)
webDriver.get("https://www.baidu.com");
sleep(1500);
// 打开百度图片窗口
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();
sleep(1000);
// 先将窗口句柄切换到百度图片窗口
// 1.获取所有窗口句柄
Set<String> windowHandles = webDriver.getWindowHandles();
// 2.找到最后一个句柄即为百度图片窗口句柄
String imageHHandle = "";
for (String handle : windowHandles) {
imageHHandle = handle;
}
// 3.切换到百度图片窗口
webDriver.switchTo().window(imageHHandle);
// 点击百度图片窗口中的头像标签
webDriver.findElement(By.cssSelector("#wrapper_head_box > div > div > div > div > div.hotquery > a:nth-child(3)")).click();
sleep(1000);
}
15. ブラウザの終了操作
webDriver.close()
現在フォーカスされているブラウザ ウィンドウを閉じても、セッションとキャッシュはクリアされません。webDriver.quit()
すべてのブラウザ ウィンドウを閉じると、セッションとキャッシュがクリアされます。
public static void main(String[] args) throws InterruptedException, IOException {
// 创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 访问百度(注:此时窗口句柄在百度首页,webDerive的所有操作只能针对首页)
webDriver.get("https://www.baidu.com");
String mainHandle = webDriver.getWindowHandle(); // 获取首页句柄
sleep(1500);
// 打开百度图片窗口
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();
sleep(1500);
// 切换到主页(这个操作只是为了将显示页面切换到首页,句柄还是首页)
webDriver.switchTo().window(mainHandle);
sleep(1500);
// 打开百度贴吧窗口
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(4)")).click();
sleep(1500);
// 关闭当前聚焦页面(注:由于此时窗口句柄为百度首页,所以此时close()会关闭首页,而不是百度图片页)
webDriver.close();
sleep(1500);
// 关闭浏览器
webDriver.quit();
}