{"id":1200,"date":"2025-03-24T08:52:37","date_gmt":"2025-03-23T23:52:37","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=1200"},"modified":"2025-03-24T08:52:37","modified_gmt":"2025-03-23T23:52:37","slug":"%e3%80%902024%e5%b9%b4%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91selenium%e3%81%a8java%e3%81%a7%e5%a7%8b%e3%82%81%e3%82%8b%e8%87%aa%e5%8b%95%e3%83%86%e3%82%b9%e3%83%88%e5%85%a5%e9%96%80-%e3%80%9c%e8%a8%ad","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=1200","title":{"rendered":"\u30102024\u5e74\u4fdd\u5b58\u7248\u3011Selenium\u3068Java\u3067\u59cb\u3081\u308b\u81ea\u52d5\u30c6\u30b9\u30c8\u5165\u9580 \u301c\u8a2d\u5b9a\u304b\u3089\u5b9f\u88c5\u307e\u3067\u5b8c\u5168\u89e3\u8aac"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" id=\"i-0\">Selenium\u3068\u306f\uff1fJava\u3067\u306e\u81ea\u52d5\u30c6\u30b9\u30c8\u3092\u59cb\u3081\u308b\u524d\u306b<\/h1>\n\n\n\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Selenium\u3068\u306f\uff1fJava\u3067\u306e\u81ea\u52d5\u30c6\u30b9\u30c8\u3092\u59cb\u3081\u308b\u524d\u306b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u30d6\u30e9\u30a6\u30b6\u81ea\u52d5\u5316\u30c4\u30fc\u30ebSelenium\u306e\u57fa\u672c\u6982\u5ff5\u3092\u7406\u89e3\u3057\u3088\u3046<\/a>      <\/li>      <li>        <a href=\"#i-3\">\u306a\u305cJava\u3067Selenium\u3092\u4f7f\u3046\u3079\u304d\u306a\u306e\u304b\uff1f 3\u3064\u306e\u6c7a\u5b9a\u7684\u306a\u7406\u7531<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-8\">\u5c0e\u5165\u6642\u306e\u691c\u8a0e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-9\">\u958b\u767a\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-10\">Java\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306eSelenium\u5c0e\u5165\uff1aMaven\/Gradle\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-13\">WebDriver \u306e\u6e96\u5099\uff1aChromeDriver\/FirefoxDriver \u306e\u8a2d\u5b9a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-18\">\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u6642\u306e\u6ce8\u610f\u70b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-19\">Selenium \u306e\u57fa\u672c\u64cd\u4f5c\u3092\u30de\u30b9\u30bf\u30fc\u3057\u3088\u3046<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-20\">\u30d6\u30e9\u30a6\u30b6\u306e\u8d77\u52d5\u30fb\u7d42\u4e86\u3068\u30da\u30fc\u30b8\u79fb\u52d5\u306e\u5236\u5fa1\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-22\">\u8981\u7d20\u306e\u691c\u7d22\u3068\u64cd\u4f5c\uff1a8\u3064\u306e\u4e3b\u8981\u306a\u30ed\u30b1\u30fc\u30bf\u30fc\u6d3b\u7528\u8853<\/a>      <\/li>      <li>        <a href=\"#i-28\">\u5f85\u6a5f\u51e6\u7406\u306e\u5b9f\u88c5\uff1a\u6697\u9ed9\u7684\u5f85\u6a5f\u3068\u660e\u793a\u7684\u5f85\u6a5f\u306e\u4f7f\u3044\u5206\u3051<\/a>      <\/li>      <li>        <a href=\"#i-32\">\u5f85\u6a5f\u51e6\u7406\u306e\u4f7f\u3044\u5206\u3051\u30ac\u30a4\u30c9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-33\">\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-34\">\u5b9f\u8df5\u7684\u306a\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u5b9f\u88c5\u30ac\u30a4\u30c9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-35\">\u30ed\u30b0\u30a4\u30f3\u30d5\u30a9\u30fc\u30e0\u306e\u30c6\u30b9\u30c8\u81ea\u52d5\u5316\uff1a\u5b8c\u5168\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u4ed8\u304d<\/a>      <\/li>      <li>        <a href=\"#i-38\">\u30c7\u30fc\u30bf\u99c6\u52d5\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\uff1aTestNG \u3092\u6d3b\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u30c6\u30b9\u30c8\u8a2d\u8a08<\/a>      <\/li>      <li>        <a href=\"#i-42\">\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u53d6\u5f97\u3068\u5b9f\u884c\u7d50\u679c\u30ec\u30dd\u30fc\u30c8\u306e\u4f5c\u6210\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-45\">\u30c6\u30b9\u30c8\u5b9f\u884c\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-46\">\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u3092\u9ad8\u3081\u308b\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u8a2d\u8a08<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-47\">\u30da\u30fc\u30b8\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u30e2\u30c7\u30eb\u30d1\u30bf\u30fc\u30f3\u3092\u6d3b\u7528\u3057\u305f\u69cb\u9020\u5316\u306e\u5b9f\u8df5<\/a>      <\/li>      <li>        <a href=\"#i-49\">\u5171\u901a\u51e6\u7406\u306e\u62bd\u8c61\u5316\uff1a\u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u4f5c\u6210\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-52\">\u8a2d\u8a08\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-53\">\u9ad8\u5ea6\u306a\u81ea\u52d5\u5316\u624b\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-54\">JavaScript\u5b9f\u884c\u3068\u30a2\u30e9\u30fc\u30c8\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-57\">\u8907\u6570\u30d6\u30e9\u30a6\u30b6\u3067\u306e\u30de\u30eb\u30c1\u30d6\u30e9\u30a6\u30b6\u30c6\u30b9\u30c8\u5b9f\u884c\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-61\">\u9ad8\u5ea6\u306a\u81ea\u52d5\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-62\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-63\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\uff1a\u5b9f\u4f8b\u30d9\u30fc\u30b9\u3067\u89e3\u8aac<\/a>      <\/li>      <li>        <a href=\"#i-66\">\u30c6\u30b9\u30c8\u5b9f\u884c\u306e\u5b89\u5b9a\u6027\u3092\u9ad8\u3081\u308b7\u3064\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-71\">\u5b89\u5b9a\u6027\u5411\u4e0a\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-1\">\u30d6\u30e9\u30a6\u30b6\u81ea\u52d5\u5316\u30c4\u30fc\u30ebSelenium\u306e\u57fa\u672c\u6982\u5ff5\u3092\u7406\u89e3\u3057\u3088\u3046<\/h2>\n\n\n\n<p>Selenium\u306f\u3001Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c6\u30b9\u30c8\u81ea\u52d5\u5316\u3092\u5b9f\u73fe\u3059\u308b\u5f37\u529b\u306a\u30c4\u30fc\u30eb\u30bb\u30c3\u30c8\u3067\u3059\u30022004\u5e74\u306b\u8a95\u751f\u3057\u3066\u4ee5\u6765\u3001Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30c6\u30b9\u30c8\u306e\u4e8b\u5b9f\u4e0a\u306e\u6a19\u6e96\u3068\u3057\u3066\u4e16\u754c\u4e2d\u3067\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">Selenium\u306e\u57fa\u672c\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/h3>\n\n\n\n<p>Selenium\u306f\u4e3b\u306b\u4ee5\u4e0b\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3067\u69cb\u6210\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Selenium WebDriver<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d6\u30e9\u30a6\u30b6\u3092\u76f4\u63a5\u5236\u5fa1\u3059\u308b\u305f\u3081\u306e\u4e2d\u6838\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8<\/li>\n\n\n\n<li>\u5404\u30d6\u30e9\u30a6\u30b6\u5c02\u7528\u306e\u30c9\u30e9\u30a4\u30d0\u30fc\u3092\u901a\u3058\u3066\u30d6\u30e9\u30a6\u30b6\u3092\u64cd\u4f5c<\/li>\n\n\n\n<li>\u30af\u30ed\u30b9\u30d6\u30e9\u30a6\u30b6\u30c6\u30b9\u30c8\u3092\u53ef\u80fd\u306b\u3059\u308b\u7d71\u4e00\u7684\u306a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Selenium Grid<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8907\u6570\u306e\u30de\u30b7\u30f3\u3067\u306e\u4e26\u5217\u30c6\u30b9\u30c8\u5b9f\u884c\u3092\u5b9f\u73fe<\/li>\n\n\n\n<li>\u30af\u30e9\u30a6\u30c9\u74b0\u5883\u3067\u306e\u30c6\u30b9\u30c8\u5b9f\u884c\u3082\u30b5\u30dd\u30fc\u30c8<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Selenium IDE<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d6\u30e9\u30a6\u30b6\u306e\u64cd\u4f5c\u3092\u8a18\u9332\u30fb\u518d\u751f\u3067\u304d\u308bChrome\/Firefox\u62e1\u5f35\u6a5f\u80fd<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u4f5c\u6210\u306e\u521d\u671f\u6bb5\u968e\u3067\u6d3b\u7528\u53ef\u80fd<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">\u306a\u305cJava\u3067Selenium\u3092\u4f7f\u3046\u3079\u304d\u306a\u306e\u304b\uff1f 3\u3064\u306e\u6c7a\u5b9a\u7684\u306a\u7406\u7531<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">1. \u8c4a\u5bcc\u306a\u30a8\u30b3\u30b7\u30b9\u30c6\u30e0\u3068\u30e9\u30a4\u30d6\u30e9\u30ea<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TestNG\/JUnit\u3068\u306e\u9023\u643a<\/strong><\/li>\n\n\n\n<li>\u5f37\u529b\u306a\u30c6\u30b9\u30c8\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u306e\u7d71\u5408\u304c\u5bb9\u6613<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u99c6\u52d5\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\u304c\u7c21\u5358<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u5b9f\u884c\u306e\u4e26\u5217\u5316\u304c\u30b5\u30dd\u30fc\u30c8<\/li>\n\n\n\n<li><strong>Build\/\u4f9d\u5b58\u95a2\u4fc2\u7ba1\u7406<\/strong><\/li>\n\n\n\n<li>Maven\u3084Gradle\u306b\u3088\u308b\u4f9d\u5b58\u95a2\u4fc2\u306e\u7ba1\u7406\u304c\u5bb9\u6613<\/li>\n\n\n\n<li>CI\u30c4\u30fc\u30eb\u3068\u306e\u9023\u643a\u304c\u5145\u5b9f<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">2. \u5b89\u5b9a\u6027\u3068\u4fdd\u5b88\u6027<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u9759\u7684\u578b\u4ed8\u3051\u8a00\u8a9e\u306e\u5229\u70b9<\/strong><\/li>\n\n\n\n<li>\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306e\u30a8\u30e9\u30fc\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>IDE\u306e\u30b5\u30dd\u30fc\u30c8\u306b\u3088\u308b\u9ad8\u3044\u958b\u767a\u52b9\u7387<\/li>\n\n\n\n<li>\u30ea\u30d5\u30a1\u30af\u30bf\u30ea\u30f3\u30b0\u306e\u5bb9\u6613\u3055<\/li>\n\n\n\n<li><strong>\u30c7\u30b6\u30a4\u30f3\u30d1\u30bf\u30fc\u30f3\u306e\u9069\u7528<\/strong><\/li>\n\n\n\n<li>Page Object Model\u306e\u5b9f\u88c5\u304c\u76f4\u611f\u7684<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\u518d\u5229\u7528\u6027\u304c\u9ad8\u3044<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">3. \u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u3067\u306e\u5b9f\u7e3e<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5927\u898f\u6a21\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e\u63a1\u7528\u5b9f\u7e3e<\/strong><\/li>\n\n\n\n<li>\u591a\u304f\u306e\u4f01\u696d\u3067\u306e\u63a1\u7528\u5b9f\u7e3e<\/li>\n\n\n\n<li>\u8c4a\u5bcc\u306a\u6280\u8853\u60c5\u5831\u3068\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u30b5\u30dd\u30fc\u30c8<\/li>\n\n\n\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u30b3\u30f3\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9<\/strong><\/li>\n\n\n\n<li>\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u74b0\u5883\u3067\u306e\u5b9f\u7e3e<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8981\u4ef6\u3078\u306e\u5bfe\u5fdc\u304c\u5bb9\u6613<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">Java\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ WebDriver\u306e\u521d\u671f\u5316\u4f8b\nWebDriver driver = new ChromeDriver();\n\n\/\/ \u30da\u30fc\u30b8\u9077\u79fb\u3068\u8981\u7d20\u64cd\u4f5c\u306e\u57fa\u672c\u4f8b\ndriver.get(\"https:\/\/example.com\");\nWebElement searchBox = driver.findElement(By.id(\"search\"));\nsearchBox.sendKeys(\"test automation\");\nsearchBox.submit();\n\n\/\/ \u660e\u793a\u7684\u306a\u5f85\u6a5f\u51e6\u7406\u306e\u4f8b\nWebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));\nWebElement result = wait.until(\n    ExpectedConditions.presenceOfElementLocated(By.className(\"result\"))\n);<\/pre>\n\n\n\n<p>\u3053\u306e\u30b3\u30fc\u30c9\u4f8b\u304b\u3089\u3082\u5206\u304b\u308b\u3088\u3046\u306b\u3001Java\u3092\u4f7f\u7528\u3057\u305fSelenium\u306e\u5b9f\u88c5\u306f\u76f4\u611f\u7684\u3067\u7406\u89e3\u3057\u3084\u3059\u3044\u3082\u306e\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u5c0e\u5165\u6642\u306e\u691c\u8a0e\u30dd\u30a4\u30f3\u30c8<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u898f\u6a21\u3068\u6027\u8cea<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e2d\u301c\u5927\u898f\u6a21\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u3042\u308c\u3070Java + Selenium\u306e\u7d44\u307f\u5408\u308f\u305b\u304c\u6700\u9069<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u306e\u6280\u8853\u30b9\u30bf\u30c3\u30af\u3068\u306e\u6574\u5408\u6027\u3092\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u306e\u8003\u616e<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9577\u671f\u7684\u306a\u4fdd\u5b88\u6027\u3092\u91cd\u8996\u3059\u308b\u5834\u5408\u3001Java\u306e\u578b\u5b89\u5168\u6027\u306f\u5927\u304d\u306a\u5229\u70b9<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u5185\u3067\u306e\u30b3\u30fc\u30c9\u54c1\u8cea\u7dad\u6301\u304c\u5bb9\u6613<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9f\u884c\u74b0\u5883\u306e\u8981\u4ef6<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CI\/CD\u74b0\u5883\u3068\u306e\u89aa\u548c\u6027<\/li>\n\n\n\n<li>\u30af\u30ed\u30b9\u30d6\u30e9\u30a6\u30b6\u30c6\u30b9\u30c8\u306e\u5fc5\u8981\u6027<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-9\">\u958b\u767a\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-10\">Java\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306eSelenium\u5c0e\u5165\uff1aMaven\/Gradle\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">Maven\u3067\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<p>\u307e\u305a\u3001<code>pom.xml<\/code>\u306b\u5fc5\u8981\u306a\u4f9d\u5b58\u95a2\u4fc2\u3092\u8ffd\u52a0\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;dependencies&gt;\n    &lt;!-- Selenium WebDriver --&gt;\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.seleniumhq.selenium&lt;\/groupId&gt;\n            &lt;artifactId&gt;selenium-java&lt;\/artifactId&gt;\n            &lt;version&gt;4.18.1&lt;\/version&gt;\n        &lt;\/dependency&gt;\n\n        &lt;!-- TestNG for testing --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.testng&lt;\/groupId&gt;\n            &lt;artifactId&gt;testng&lt;\/artifactId&gt;\n            &lt;version&gt;7.9.0&lt;\/version&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n\n        &lt;!-- WebDriverManager --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;io.github.bonigarcia&lt;\/groupId&gt;\n            &lt;artifactId&gt;webdrivermanager&lt;\/artifactId&gt;\n            &lt;version&gt;5.7.0&lt;\/version&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n&lt;\/dependencies&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">Gradle\u3067\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<p><code>build.gradle<\/code>\u3078\u306e\u4f9d\u5b58\u95a2\u4fc2\u306e\u8ffd\u52a0\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dependencies {\n    \/\/ Selenium WebDriver\n    implementation 'org.seleniumhq.selenium:selenium-java:4.18.1'\n\n    \/\/ TestNG\n    testImplementation 'org.testng:testng:7.9.0'\n\n    \/\/ WebDriverManager\n    implementation 'io.github.bonigarcia:webdrivermanager:5.7.0'\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-13\">WebDriver \u306e\u6e96\u5099\uff1aChromeDriver\/FirefoxDriver \u306e\u8a2d\u5b9a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">ChromeDriver\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/h3>\n\n\n\n<p>WebDriverManager\u3092\u4f7f\u7528\u3057\u305f\u6700\u65b0\u306e\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import io.github.bonigarcia.wdm.WebDriverManager;\nimport org.openqa.selenium.WebDriver;\nimport org.openqa.selenium.chrome.ChromeDriver;\nimport org.openqa.selenium.chrome.ChromeOptions;\n\npublic class ChromeDriverSetup {\n    public static WebDriver setupChromeDriver() {\n        \/\/ WebDriverManager\u304cChromeDriver\u3092\u81ea\u52d5\u3067\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\n        WebDriverManager.chromedriver().setup();\n\n        \/\/ Chrome \u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a\n        ChromeOptions options = new ChromeOptions();\n        options.addArguments(\"--start-maximized\");  \/\/ \u30d6\u30e9\u30a6\u30b6\u3092\u6700\u5927\u5316\n        options.addArguments(\"--disable-notifications\");  \/\/ \u901a\u77e5\u3092\u7121\u52b9\u5316\n\n        \/\/ Headless\u30e2\u30fc\u30c9\u306e\u305f\u3081\u306eOptional\u8a2d\u5b9a\n        \/\/ options.addArguments(\"--headless\");\n\n        \/\/ ChromeDriver\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u4f5c\u6210\n        return new ChromeDriver(options);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">FirefoxDriver\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import io.github.bonigarcia.wdm.WebDriverManager;\nimport org.openqa.selenium.WebDriver;\nimport org.openqa.selenium.firefox.FirefoxDriver;\nimport org.openqa.selenium.firefox.FirefoxOptions;\n\npublic class FirefoxDriverSetup {\n    public static WebDriver setupFirefoxDriver() {\n        \/\/ WebDriverManager\u304cGeckoDriver\u3092\u81ea\u52d5\u3067\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\n        WebDriverManager.firefoxdriver().setup();\n\n        \/\/ Firefox \u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a\n        FirefoxOptions options = new FirefoxOptions();\n        options.addArguments(\"--start-maximized\");\n\n        \/\/ FirefoxDriver\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u4f5c\u6210\n        return new FirefoxDriver(options);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u5171\u901a\u306e\u30d9\u30fc\u30b9\u8a2d\u5b9a\u30af\u30e9\u30b9<\/h3>\n\n\n\n<p>\u30c6\u30b9\u30c8\u30af\u30e9\u30b9\u3067\u5171\u901a\u3057\u3066\u4f7f\u7528\u3059\u308b\u30d9\u30fc\u30b9\u8a2d\u5b9a\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import org.openqa.selenium.WebDriver;\nimport org.testng.annotations.AfterClass;\nimport org.testng.annotations.BeforeClass;\n\npublic class BaseTest {\n    protected WebDriver driver;\n\n    @BeforeClass\n    public void setUp() {\n        \/\/ Chrome\/Firefox\u306e\u9078\u629e\n        driver = ChromeDriverSetup.setupChromeDriver();\n        \/\/ \u307e\u305f\u306f\n        \/\/ driver = FirefoxDriverSetup.setupFirefoxDriver();\n\n        \/\/ \u6697\u9ed9\u7684\u306a\u5f85\u6a5f\u6642\u9593\u306e\u8a2d\u5b9a\n        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));\n    }\n\n    @AfterClass\n    public void tearDown() {\n        if (driver != null) {\n            driver.quit();\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u52d5\u4f5c\u78ba\u8a8d\u7528\u306e\u7c21\u5358\u306a\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import org.testng.Assert;\nimport org.testng.annotations.Test;\n\npublic class SampleTest extends BaseTest {\n    @Test\n    public void testGoogleSearch() {\n        \/\/ Google\u306b\u30a2\u30af\u30bb\u30b9\n        driver.get(\"https:\/\/www.google.com\");\n\n        \/\/ \u30bf\u30a4\u30c8\u30eb\u306e\u78ba\u8a8d\n        String title = driver.getTitle();\n        Assert.assertTrue(title.contains(\"Google\"));\n\n        System.out.println(\"\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u6210\u529f\uff01\u57fa\u672c\u7684\u306a\u30c6\u30b9\u30c8\u304c\u5b9f\u884c\u3067\u304d\u307e\u3057\u305f\u3002\");\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-18\">\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u6642\u306e\u6ce8\u610f\u70b9<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>JDK\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u78ba\u8a8d<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Java 11\u4ee5\u4e0a\u3092\u63a8\u5968<\/li>\n\n\n\n<li>JAVA_HOME\u74b0\u5883\u5909\u6570\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d6\u30e9\u30a6\u30b6\u30d0\u30fc\u30b8\u30e7\u30f3\u3068Driver\u306e\u4e92\u63db\u6027<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WebDriverManager\u304c\u81ea\u52d5\u7684\u306b\u9069\u5207\u306a\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u9078\u629e<\/li>\n\n\n\n<li>\u624b\u52d5\u3067Driver\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u5834\u5408\u306f\u4e92\u63db\u6027\u306b\u6ce8\u610f<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d7\u30ed\u30ad\u30b7\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u793e\u5185\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3067\u306e\u5229\u7528\u6642\u306f\u9069\u5207\u306a\u30d7\u30ed\u30ad\u30b7\u8a2d\u5b9a\u304c\u5fc5\u8981<\/li>\n\n\n\n<li>WebDriverManager\u306e\u30d7\u30ed\u30ad\u30b7\u8a2d\u5b9a\u65b9\u6cd5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c6\u30b9\u30c8\u5b9f\u884c\u6642\u306e\u30d2\u30fc\u30d7\u30b5\u30a4\u30ba\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30d1\u30e9\u30ec\u30eb\u5b9f\u884c\u6642\u306e\u30ea\u30bd\u30fc\u30b9\u8003\u616e<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-19\">Selenium \u306e\u57fa\u672c\u64cd\u4f5c\u3092\u30de\u30b9\u30bf\u30fc\u3057\u3088\u3046<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">\u30d6\u30e9\u30a6\u30b6\u306e\u8d77\u52d5\u30fb\u7d42\u4e86\u3068\u30da\u30fc\u30b8\u79fb\u52d5\u306e\u5236\u5fa1\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u57fa\u672c\u7684\u306a\u30d6\u30e9\u30a6\u30b6\u64cd\u4f5c<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import org.openqa.selenium.WebDriver;\nimport org.openqa.selenium.chrome.ChromeDriver;\nimport org.openqa.selenium.Dimension;\nimport org.openqa.selenium.Point;\n\npublic class BrowserOperations {\n    public static void main(String[] args) {\n        WebDriver driver = new ChromeDriver();\n\n        \/\/ \u30d6\u30e9\u30a6\u30b6\u30a6\u30a3\u30f3\u30c9\u30a6\u306e\u64cd\u4f5c\n        driver.manage().window().maximize();  \/\/ \u30a6\u30a3\u30f3\u30c9\u30a6\u6700\u5927\u5316\n        driver.manage().window().setSize(new Dimension(1024, 768));  \/\/ \u30b5\u30a4\u30ba\u6307\u5b9a\n        driver.manage().window().setPosition(new Point(0, 0));  \/\/ \u4f4d\u7f6e\u6307\u5b9a\n\n        \/\/ \u30da\u30fc\u30b8\u79fb\u52d5\n        driver.get(\"https:\/\/www.example.com\");  \/\/ URL\u306b\u76f4\u63a5\u30a2\u30af\u30bb\u30b9\n        driver.navigate().to(\"https:\/\/www.example.com\");  \/\/ \u5c65\u6b74\u3092\u4fdd\u6301\u3057\u3066\u30a2\u30af\u30bb\u30b9\n\n        \/\/ \u30d6\u30e9\u30a6\u30b6\u306e\u623b\u308b\u30fb\u9032\u3080\u30fb\u66f4\u65b0\n        driver.navigate().back();  \/\/ \u623b\u308b\n        driver.navigate().forward();  \/\/ \u9032\u3080\n        driver.navigate().refresh();  \/\/ \u66f4\u65b0\n\n        \/\/ \u30d6\u30e9\u30a6\u30b6\u306e\u7d42\u4e86\n        driver.close();  \/\/ \u73fe\u5728\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3092\u9589\u3058\u308b\n        driver.quit();   \/\/ \u3059\u3079\u3066\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3092\u9589\u3058\u3066\u30c9\u30e9\u30a4\u30d0\u30fc\u3092\u7d42\u4e86\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-22\">\u8981\u7d20\u306e\u691c\u7d22\u3068\u64cd\u4f5c\uff1a8\u3064\u306e\u4e3b\u8981\u306a\u30ed\u30b1\u30fc\u30bf\u30fc\u6d3b\u7528\u8853<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">1. ID \u306b\u3088\u308b\u8981\u7d20\u306e\u7279\u5b9a<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u6700\u3082\u63a8\u5968\u3055\u308c\u308b\u65b9\u6cd5\uff1a\u9ad8\u901f\u3067\u4e00\u610f\nWebElement element = driver.findElement(By.id(\"login-button\"));<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">2. CSS \u30bb\u30ec\u30af\u30bf\u306b\u3088\u308b\u8981\u7d20\u306e\u7279\u5b9a<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u8907\u96d1\u306a\u8981\u7d20\u306e\u7279\u5b9a\u306b\u6709\u7528\nWebElement element = driver.findElement(By.cssSelector(\".login-form input[type='submit']\"));<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">3. XPath \u306b\u3088\u308b\u8981\u7d20\u306e\u7279\u5b9a<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u52d5\u7684\u306a\u8981\u7d20\u3084\u8907\u96d1\u306a\u69cb\u9020\u306e\u8981\u7d20\u3092\u7279\u5b9a\nWebElement element = driver.findElement(By.xpath(\"\/\/button[contains(text(), '\u30ed\u30b0\u30a4\u30f3')]\"));<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">4. \u30af\u30e9\u30b9\u540d\u306b\u3088\u308b\u8981\u7d20\u306e\u7279\u5b9a<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u540c\u3058\u30af\u30e9\u30b9\u306e\u8981\u7d20\u3092\u307e\u3068\u3081\u3066\u53d6\u5f97\nList&lt;WebElement&gt; elements = driver.findElements(By.className(\"menu-item\"));<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">5. \u8981\u7d20\u306e\u64cd\u4f5c\u65b9\u6cd5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ElementOperations {\n    public void demonstrateElementOperations(WebDriver driver) {\n        \/\/ \u30c6\u30ad\u30b9\u30c8\u5165\u529b\n        WebElement inputField = driver.findElement(By.id(\"username\"));\n        inputField.sendKeys(\"testuser\");  \/\/ \u30c6\u30ad\u30b9\u30c8\u5165\u529b\n        inputField.clear();  \/\/ \u30c6\u30ad\u30b9\u30c8\u30af\u30ea\u30a2\n\n        \/\/ \u30af\u30ea\u30c3\u30af\u64cd\u4f5c\n        WebElement button = driver.findElement(By.name(\"login\"));\n        button.click();\n\n        \/\/ \u8981\u7d20\u306e\u72b6\u614b\u78ba\u8a8d\n        boolean isDisplayed = button.isDisplayed();  \/\/ \u8868\u793a\u72b6\u614b\n        boolean isEnabled = button.isEnabled();      \/\/ \u6709\u52b9\u72b6\u614b\n        boolean isSelected = button.isSelected();    \/\/ \u9078\u629e\u72b6\u614b\n\n        \/\/ \u8981\u7d20\u306e\u5c5e\u6027\u30fb\u30c6\u30ad\u30b9\u30c8\u53d6\u5f97\n        String value = inputField.getAttribute(\"value\");\n        String text = button.getText();\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-28\">\u5f85\u6a5f\u51e6\u7406\u306e\u5b9f\u88c5\uff1a\u6697\u9ed9\u7684\u5f85\u6a5f\u3068\u660e\u793a\u7684\u5f85\u6a5f\u306e\u4f7f\u3044\u5206\u3051<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">1. \u6697\u9ed9\u7684\u5f85\u6a5f\uff08Implicit Wait\uff09<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30c9\u30e9\u30a4\u30d0\u30fc\u751f\u6210\u5f8c\u306b\u4e00\u5ea6\u8a2d\u5b9a\ndriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-30\">2. \u660e\u793a\u7684\u5f85\u6a5f\uff08Explicit Wait\uff09<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class WaitOperations {\n    public void demonstrateWaitOperations(WebDriver driver) {\n        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));\n\n        \/\/ \u8981\u7d20\u304c\u8868\u793a\u3055\u308c\u308b\u307e\u3067\u5f85\u6a5f\n        WebElement element = wait.until(\n            ExpectedConditions.visibilityOfElementLocated(By.id(\"dynamic-content\"))\n        );\n\n        \/\/ \u8981\u7d20\u304c\u30af\u30ea\u30c3\u30af\u53ef\u80fd\u306b\u306a\u308b\u307e\u3067\u5f85\u6a5f\n        WebElement button = wait.until(\n            ExpectedConditions.elementToBeClickable(By.id(\"submit-button\"))\n        );\n\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u6761\u4ef6\u3067\u306e\u5f85\u6a5f\n        wait.until(driver -&gt; {\n            WebElement elem = driver.findElement(By.id(\"status\"));\n            return elem.getText().contains(\"\u5b8c\u4e86\");\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-31\">3. Fluent Wait \u306e\u6d3b\u7528<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u3088\u308a\u67d4\u8edf\u306a\u5f85\u6a5f\u8a2d\u5b9a\nWait&lt;WebDriver&gt; wait = new FluentWait&lt;&gt;(driver)\n    .withTimeout(Duration.ofSeconds(30))\n    .pollingEvery(Duration.ofSeconds(5))\n    .ignoring(NoSuchElementException.class);\n\nWebElement element = wait.until(driver -&gt; {\n    return driver.findElement(By.id(\"dynamic-element\"));\n});<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-32\">\u5f85\u6a5f\u51e6\u7406\u306e\u4f7f\u3044\u5206\u3051\u30ac\u30a4\u30c9<\/h2>\n\n\n<div id=\"id-b7f16dea-9311-4c97-81e7-353759589819\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5f85\u6a5f\u30bf\u30a4\u30d7<\/th><th>\u4f7f\u7528\u30b7\u30fc\u30f3<\/th><th>\u30e1\u30ea\u30c3\u30c8<\/th><th>\u30c7\u30e1\u30ea\u30c3\u30c8<\/th><\/tr><\/thead><tbody><tr><td>\u6697\u9ed9\u7684\u5f85\u6a5f<\/td><td>\u57fa\u672c\u7684\u306a\u8981\u7d20\u5f85\u6a5f<\/td><td>\u8a2d\u5b9a\u304c\u7c21\u5358<\/td><td>\u67d4\u8edf\u6027\u306b\u6b20\u3051\u308b<\/td><\/tr><tr><td>\u660e\u793a\u7684\u5f85\u6a5f<\/td><td>\u7279\u5b9a\u6761\u4ef6\u3067\u306e\u5f85\u6a5f<\/td><td>\u7d30\u304b\u3044\u5236\u5fa1\u304c\u53ef\u80fd<\/td><td>\u30b3\u30fc\u30c9\u304c\u5197\u9577<\/td><\/tr><tr><td>Fluent Wait<\/td><td>\u8907\u96d1\u306a\u5f85\u6a5f\u6761\u4ef6<\/td><td>\u9ad8\u5ea6\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/td><td>\u5b9f\u88c5\u304c\u8907\u96d1<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"i-33\">\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8981\u7d20\u306e\u7279\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ID\u3092\u512a\u5148\u7684\u306b\u4f7f\u7528<\/li>\n\n\n\n<li>\u52d5\u7684\u306a\u8981\u7d20\u306b\u306fXPath\u3092\u6d3b\u7528<\/li>\n\n\n\n<li>CSS\u30bb\u30ec\u30af\u30bf\u3067\u968e\u5c64\u69cb\u9020\u3092\u6307\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5f85\u6a5f\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6697\u9ed9\u7684\u5f85\u6a5f\u306f\u30b0\u30ed\u30fc\u30d0\u30eb\u306b\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u7279\u5b9a\u306e\u8981\u7d20\u306b\u306f\u660e\u793a\u7684\u5f85\u6a5f\u3092\u4f7f\u7528<\/li>\n\n\n\n<li>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u5024\u306f\u9069\u5207\u306b\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8981\u7d20\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306e\u4f8b\u5916\u51e6\u7406<\/li>\n\n\n\n<li>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u6642\u306e\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-34\">\u5b9f\u8df5\u7684\u306a\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u5b9f\u88c5\u30ac\u30a4\u30c9<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-35\">\u30ed\u30b0\u30a4\u30f3\u30d5\u30a9\u30fc\u30e0\u306e\u30c6\u30b9\u30c8\u81ea\u52d5\u5316\uff1a\u5b8c\u5168\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u4ed8\u304d<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-36\">\u30da\u30fc\u30b8\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import org.openqa.selenium.WebDriver;\nimport org.openqa.selenium.WebElement;\nimport org.openqa.selenium.support.FindBy;\nimport org.openqa.selenium.support.PageFactory;\n\npublic class LoginPage {\n    private WebDriver driver;\n\n    \/\/ \u30da\u30fc\u30b8\u8981\u7d20\u306e\u5b9a\u7fa9\n    @FindBy(id = \"username\")\n    private WebElement usernameInput;\n\n    @FindBy(id = \"password\")\n    private WebElement passwordInput;\n\n    @FindBy(id = \"login-button\")\n    private WebElement loginButton;\n\n    @FindBy(css = \".error-message\")\n    private WebElement errorMessage;\n\n    \/\/ \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\n    public LoginPage(WebDriver driver) {\n        this.driver = driver;\n        PageFactory.initElements(driver, this);\n    }\n\n    \/\/ \u30da\u30fc\u30b8\u64cd\u4f5c\u30e1\u30bd\u30c3\u30c9\n    public void enterUsername(String username) {\n        usernameInput.clear();\n        usernameInput.sendKeys(username);\n    }\n\n    public void enterPassword(String password) {\n        passwordInput.clear();\n        passwordInput.sendKeys(password);\n    }\n\n    public void clickLoginButton() {\n        loginButton.click();\n    }\n\n    public String getErrorMessage() {\n        return errorMessage.getText();\n    }\n\n    \/\/ \u7d71\u5408\u30e1\u30bd\u30c3\u30c9\n    public void login(String username, String password) {\n        enterUsername(username);\n        enterPassword(password);\n        clickLoginButton();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-37\">\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import org.testng.annotations.*;\nimport static org.testng.Assert.*;\nimport java.io.File;\nimport org.openqa.selenium.OutputType;\nimport org.openqa.selenium.TakesScreenshot;\nimport org.apache.commons.io.FileUtils;\n\npublic class LoginTest extends BaseTest {\n    private LoginPage loginPage;\n\n    @BeforeMethod\n    public void setUp() {\n        super.setUp();\n        driver.get(\"https:\/\/example.com\/login\");\n        loginPage = new LoginPage(driver);\n    }\n\n    @Test(description = \"\u6b63\u5e38\u7cfb\uff1a\u6709\u52b9\u306a\u30af\u30ec\u30c7\u30f3\u30b7\u30e3\u30eb\u3067\u30ed\u30b0\u30a4\u30f3\")\n    public void testSuccessfulLogin() {\n        loginPage.login(\"validUser\", \"validPass\");\n        assertTrue(driver.getCurrentUrl().contains(\"\/dashboard\"));\n    }\n\n    @Test(description = \"\u7570\u5e38\u7cfb\uff1a\u7121\u52b9\u306a\u30af\u30ec\u30c7\u30f3\u30b7\u30e3\u30eb\u3067\u30ed\u30b0\u30a4\u30f3\")\n    public void testFailedLogin() {\n        loginPage.login(\"invalidUser\", \"invalidPass\");\n        assertEquals(loginPage.getErrorMessage(), \"Invalid credentials\");\n    }\n\n    \/\/ \u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u64ae\u5f71\u7528\u306e\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u30e1\u30bd\u30c3\u30c9\n    private void captureScreenshot(String fileName) {\n        try {\n            TakesScreenshot ts = (TakesScreenshot) driver;\n            File source = ts.getScreenshotAs(OutputType.FILE);\n            FileUtils.copyFile(source, new File(\".\/screenshots\/\" + fileName));\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-38\">\u30c7\u30fc\u30bf\u99c6\u52d5\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\uff1aTestNG \u3092\u6d3b\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u30c6\u30b9\u30c8\u8a2d\u8a08<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-39\">\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u6e96\u5099\uff08testng.xml\uff09<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!DOCTYPE suite SYSTEM \"https:\/\/testng.org\/testng-1.0.dtd\"&gt;\n&lt;suite name=\"Login Test Suite\"&gt;\n    &lt;test name=\"Login Tests\"&gt;\n        &lt;classes&gt;\n            &lt;class name=\"com.example.tests.LoginDataDrivenTest\"\/&gt;\n        &lt;\/classes&gt;\n    &lt;\/test&gt;\n&lt;\/suite&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-40\">\u30c7\u30fc\u30bf\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class LoginDataProvider {\n    @DataProvider(name = \"loginData\")\n    public Object[][] getLoginData() {\n        return new Object[][] {\n            {\"user1\", \"pass1\", true, \"Valid user login\"},\n            {\"user2\", \"wrong\", false, \"Invalid password\"},\n            {\"\", \"pass1\", false, \"Empty username\"},\n            {\"user1\", \"\", false, \"Empty password\"}\n        };\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-41\">\u30c7\u30fc\u30bf\u99c6\u52d5\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class LoginDataDrivenTest extends BaseTest {\n    private LoginPage loginPage;\n\n    @BeforeMethod\n    public void setUp() {\n        super.setUp();\n        loginPage = new LoginPage(driver);\n    }\n\n    @Test(dataProvider = \"loginData\", dataProviderClass = LoginDataProvider.class)\n    public void testLogin(String username, String password, \n                         boolean expectedSuccess, String testCase) {\n        \/\/ \u30c6\u30b9\u30c8\u5b9f\u884c\u524d\u306e\u30ed\u30b0\n        logger.info(\"\u5b9f\u884c\u4e2d\u306e\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9: \" + testCase);\n\n        try {\n            loginPage.login(username, password);\n\n            if (expectedSuccess) {\n                assertTrue(driver.getCurrentUrl().contains(\"\/dashboard\"));\n            } else {\n                assertTrue(loginPage.getErrorMessage().length() &gt; 0);\n            }\n\n        } catch (Exception e) {\n            \/\/ \u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u64ae\u5f71\n            captureScreenshot(testCase.replaceAll(\"\\\\s+\", \"_\") + \".png\");\n            throw e;\n        }\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-42\">\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u53d6\u5f97\u3068\u5b9f\u884c\u7d50\u679c\u30ec\u30dd\u30fc\u30c8\u306e\u4f5c\u6210\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-43\">\u30ab\u30b9\u30bf\u30e0\u30c6\u30b9\u30c8\u30ea\u30b9\u30ca\u30fc\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import org.testng.ITestListener;\nimport org.testng.ITestResult;\n\npublic class TestListener implements ITestListener {\n    @Override\n    public void onTestFailure(ITestResult result) {\n        \/\/ \u30c6\u30b9\u30c8\u5931\u6557\u6642\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\n        Object currentClass = result.getInstance();\n        WebDriver driver = ((BaseTest) currentClass).getDriver();\n\n        String testMethodName = result.getMethod().getMethodName();\n        String timestamp = new SimpleDateFormat(\"yyyyMMdd_HHmmss\").format(new Date());\n        String fileName = testMethodName + \"_\" + timestamp + \".png\";\n\n        captureScreenshot(driver, fileName);\n    }\n\n    private void captureScreenshot(WebDriver driver, String fileName) {\n        try {\n            TakesScreenshot ts = (TakesScreenshot) driver;\n            File source = ts.getScreenshotAs(OutputType.FILE);\n            File destination = new File(\"test-output\/screenshots\/\" + fileName);\n            FileUtils.copyFile(source, destination);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-44\">\u30ec\u30dd\u30fc\u30c8\u8a2d\u5b9a\uff08pom.xml\uff09<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;build&gt;\n    &lt;plugins&gt;\n        &lt;plugin&gt;\n            &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n            &lt;artifactId&gt;maven-surefire-plugin&lt;\/artifactId&gt;\n            &lt;version&gt;3.2.5&lt;\/version&gt;\n            &lt;configuration&gt;\n                &lt;suiteXmlFiles&gt;\n                    &lt;suiteXmlFile&gt;testng.xml&lt;\/suiteXmlFile&gt;\n                &lt;\/suiteXmlFiles&gt;\n            &lt;\/configuration&gt;\n        &lt;\/plugin&gt;\n    &lt;\/plugins&gt;\n&lt;\/build&gt;<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-45\">\u30c6\u30b9\u30c8\u5b9f\u884c\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c6\u30b9\u30c8\u306e\u72ec\u7acb\u6027\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5404\u30c6\u30b9\u30c8\u306f\u4ed6\u306e\u30c6\u30b9\u30c8\u306b\u4f9d\u5b58\u3057\u306a\u3044<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306f\u4e8b\u524d\u306b\u7528\u610f<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u7d42\u4e86\u6642\u306b\u72b6\u614b\u3092\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u52b9\u7387\u7684\u306a\u30c7\u30fc\u30bf\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306fExcel\u3084CSV\u3067\u5916\u90e8\u7ba1\u7406<\/li>\n\n\n\n<li>\u74b0\u5883\u4f9d\u5b58\u306e\u8a2d\u5b9a\u306f\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3067\u7ba1\u7406<\/li>\n\n\n\n<li>\u6a5f\u5bc6\u60c5\u5831\u306f\u6697\u53f7\u5316\u3057\u3066\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9f\u884c\u7d50\u679c\u306e\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u306f\u65e5\u6642\u4ed8\u304d\u3067\u4fdd\u5b58<\/li>\n\n\n\n<li>\u30ed\u30b0\u306f\u8a73\u7d30\u306b\u8a18\u9332<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u30ec\u30dd\u30fc\u30c8\u306f\u5b9a\u671f\u7684\u306b\u30a2\u30fc\u30ab\u30a4\u30d6<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-46\">\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u3092\u9ad8\u3081\u308b\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u8a2d\u8a08<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-47\">\u30da\u30fc\u30b8\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u30e2\u30c7\u30eb\u30d1\u30bf\u30fc\u30f3\u3092\u6d3b\u7528\u3057\u305f\u69cb\u9020\u5316\u306e\u5b9f\u8df5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-48\">\u57fa\u672c\u69cb\u9020\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u57fa\u5e95\u30da\u30fc\u30b8\u30af\u30e9\u30b9\npublic abstract class BasePage {\n    protected WebDriver driver;\n    protected WebDriverWait wait;\n\n    public BasePage(WebDriver driver) {\n        this.driver = driver;\n        this.wait = new WebDriverWait(driver, Duration.ofSeconds(10));\n        PageFactory.initElements(driver, this);\n    }\n\n    \/\/ \u5171\u901a\u306e\u5f85\u6a5f\u51e6\u7406\n    protected WebElement waitForElementVisible(By locator) {\n        return wait.until(ExpectedConditions.visibilityOfElementLocated(locator));\n    }\n\n    protected WebElement waitForElementClickable(By locator) {\n        return wait.until(ExpectedConditions.elementToBeClickable(locator));\n    }\n\n    \/\/ \u5171\u901a\u306e\u30da\u30fc\u30b8\u64cd\u4f5c\n    protected void click(WebElement element) {\n        waitForElementClickable(element);\n        element.click();\n    }\n\n    protected void type(WebElement element, String text) {\n        waitForElementVisible(element);\n        element.clear();\n        element.sendKeys(text);\n    }\n}\n\n\/\/ \u30d8\u30c3\u30c0\u30fc\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\npublic class HeaderComponent {\n    @FindBy(id = \"search\")\n    private WebElement searchBox;\n\n    @FindBy(id = \"user-menu\")\n    private WebElement userMenu;\n\n    public void search(String keyword) {\n        searchBox.sendKeys(keyword);\n        searchBox.submit();\n    }\n\n    public void openUserMenu() {\n        userMenu.click();\n    }\n}\n\n\/\/ \u7279\u5b9a\u306e\u30da\u30fc\u30b8\u30af\u30e9\u30b9\npublic class DashboardPage extends BasePage {\n    @FindBy(css = \".dashboard-stats\")\n    private WebElement statsSection;\n\n    private HeaderComponent header;\n\n    public DashboardPage(WebDriver driver) {\n        super(driver);\n        this.header = new HeaderComponent();\n        PageFactory.initElements(driver, header);\n    }\n\n    public boolean isStatsDisplayed() {\n        return statsSection.isDisplayed();\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-49\">\u5171\u901a\u51e6\u7406\u306e\u62bd\u8c61\u5316\uff1a\u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u4f5c\u6210\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-50\">\u8981\u7d20\u64cd\u4f5c\u306e\u62bd\u8c61\u5316<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30ab\u30b9\u30bf\u30e0\u8981\u7d20\u64cd\u4f5c\u30af\u30e9\u30b9\npublic class ElementOperations {\n    private WebDriver driver;\n    private WebDriverWait wait;\n\n    public ElementOperations(WebDriver driver) {\n        this.driver = driver;\n        this.wait = new WebDriverWait(driver, Duration.ofSeconds(10));\n    }\n\n    public void safeClick(WebElement element) {\n        try {\n            wait.until(ExpectedConditions.elementToBeClickable(element));\n            element.click();\n        } catch (ElementClickInterceptedException e) {\n            ((JavascriptExecutor) driver).executeScript(\"arguments[0].click();\", element);\n        }\n    }\n\n    public void scrollIntoView(WebElement element) {\n        ((JavascriptExecutor) driver).executeScript(\n            \"arguments[0].scrollIntoView({ behavior: 'smooth', block: 'center' });\", \n            element\n        );\n    }\n}\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30a2\u30b5\u30fc\u30b7\u30e7\u30f3\u30af\u30e9\u30b9\npublic class CustomAssertions {\n    private WebDriver driver;\n    private WebDriverWait wait;\n\n    public void assertElementPresent(By locator, String message) {\n        try {\n            wait.until(ExpectedConditions.presenceOfElementLocated(locator));\n        } catch (TimeoutException e) {\n            throw new AssertionError(message);\n        }\n    }\n\n    public void assertTextPresent(WebElement element, String expectedText) {\n        wait.until(ExpectedConditions.textToBePresentInElement(element, expectedText));\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-51\">\u30c7\u30fc\u30bf\u51e6\u7406\u306e\u62bd\u8c61\u5316<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u7ba1\u7406\u30af\u30e9\u30b9\npublic class TestDataManager {\n    private Properties testData;\n\n    public TestDataManager() {\n        loadTestData();\n    }\n\n    private void loadTestData() {\n        testData = new Properties();\n        try (InputStream input = getClass().getClassLoader()\n                .getResourceAsStream(\"testdata.properties\")) {\n            testData.load(input);\n        } catch (IOException e) {\n            throw new RuntimeException(\"\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f\", e);\n        }\n    }\n\n    public String getData(String key) {\n        return testData.getProperty(key);\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-52\">\u8a2d\u8a08\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u5206\u96e2<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30da\u30fc\u30b8\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u5358\u4e00\u8cac\u4efb\u306e\u539f\u5247\u306b\u5f93\u3046<\/li>\n\n\n\n<li>\u5171\u901a\u306e\u30d8\u30c3\u30c0\u30fc\/\u30d5\u30c3\u30bf\u30fc\u306f\u500b\u5225\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3068\u3057\u3066\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3068\u30c6\u30b9\u30c8\u30ed\u30b8\u30c3\u30af\u3092\u5206\u96e2<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u62bd\u8c61\u5316\u306e\u30ec\u30d9\u30eb<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u57fa\u672c\u64cd\u4f5c\u306f BasePage \u30af\u30e9\u30b9\u306b\u5b9f\u88c5<\/li>\n\n\n\n<li>\u5171\u901a\u306e\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u30e1\u30bd\u30c3\u30c9\u306f\u5c02\u7528\u30af\u30e9\u30b9\u306b\u5206\u96e2<\/li>\n\n\n\n<li>\u74b0\u5883\u56fa\u6709\u306e\u8a2d\u5b9a\u306f\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3067\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u308f\u304b\u308a\u3084\u3059\u3044\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8<\/li>\n\n\n\n<li>\u30ea\u30c8\u30e9\u30a4\u30ed\u30b8\u30c3\u30af\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u306e\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u6570\u306e\u5916\u90e8\u5316<\/li>\n\n\n\n<li>\u30ed\u30b0\u51fa\u529b\u306e\u6a19\u6e96\u5316<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u306e\u81ea\u52d5\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c6\u30b9\u30c8\u306e\u5b89\u5b9a\u6027<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u5f85\u6a5f\u51e6\u7406\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u8981\u7d20\u306e\u72b6\u614b\u78ba\u8a8d<\/li>\n\n\n\n<li>\u74b0\u5883\u4f9d\u5b58\u306e\u6700\u5c0f\u5316<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306a\u8a2d\u8a08\u30a2\u30d7\u30ed\u30fc\u30c1\u306b\u3088\u308a\u3001\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306e\u4fdd\u5b88\u6027\u304c\u5927\u5e45\u306b\u5411\u4e0a\u3057\u3001\u9577\u671f\u7684\u306a\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30b3\u30b9\u30c8\u3092\u524a\u6e1b\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-53\">\u9ad8\u5ea6\u306a\u81ea\u52d5\u5316\u624b\u6cd5<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-54\">JavaScript\u5b9f\u884c\u3068\u30a2\u30e9\u30fc\u30c8\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-55\">JavaScriptExecutor\u306e\u6d3b\u7528<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class JavaScriptOperations {\n    private WebDriver driver;\n    private JavascriptExecutor js;\n\n    public JavaScriptOperations(WebDriver driver) {\n        this.driver = driver;\n        this.js = (JavascriptExecutor) driver;\n    }\n\n    \/\/ \u8981\u7d20\u306e\u53ef\u8996\u6027\u5909\u66f4\n    public void makeElementVisible(WebElement element) {\n        js.executeScript(\n            \"arguments[0].style.display='block';\", \n            element\n        );\n    }\n\n    \/\/ \u30b9\u30af\u30ed\u30fc\u30eb\u64cd\u4f5c\n    public void smoothScrollToElement(WebElement element) {\n        js.executeScript(\n            \"arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});\",\n            element\n        );\n    }\n\n    \/\/ \u52d5\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u64cd\u4f5c\n    public void modifyDOMContent(String elementId, String newContent) {\n        js.executeScript(\n            \"document.getElementById('\" + elementId + \"').innerHTML='\" + newContent + \"';\"\n        );\n    }\n\n    \/\/ \u975e\u8868\u793a\u8981\u7d20\u306e\u30af\u30ea\u30c3\u30af\n    public void clickHiddenElement(WebElement element) {\n        js.executeScript(\"arguments[0].click();\", element);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-56\">\u30a2\u30e9\u30fc\u30c8\u51e6\u7406\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class AlertHandler {\n    private WebDriver driver;\n    private Alert alert;\n\n    public AlertHandler(WebDriver driver) {\n        this.driver = driver;\n    }\n\n    \/\/ \u57fa\u672c\u7684\u306a\u30a2\u30e9\u30fc\u30c8\u51e6\u7406\n    public void handleBasicAlert() {\n        alert = driver.switchTo().alert();\n        alert.accept();\n    }\n\n    \/\/ \u78ba\u8a8d\u30c0\u30a4\u30a2\u30ed\u30b0\u306e\u51e6\u7406\n    public void handleConfirmAlert(boolean accept) {\n        alert = driver.switchTo().alert();\n        if (accept) {\n            alert.accept();\n        } else {\n            alert.dismiss();\n        }\n    }\n\n    \/\/ \u30d7\u30ed\u30f3\u30d7\u30c8\u30a2\u30e9\u30fc\u30c8\u306e\u51e6\u7406\n    public void handlePromptAlert(String input) {\n        alert = driver.switchTo().alert();\n        alert.sendKeys(input);\n        alert.accept();\n    }\n\n    \/\/ \u30a2\u30e9\u30fc\u30c8\u30c6\u30ad\u30b9\u30c8\u306e\u53d6\u5f97\n    public String getAlertText() {\n        alert = driver.switchTo().alert();\n        return alert.getText();\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-57\">\u8907\u6570\u30d6\u30e9\u30a6\u30b6\u3067\u306e\u30de\u30eb\u30c1\u30d6\u30e9\u30a6\u30b6\u30c6\u30b9\u30c8\u5b9f\u884c\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-58\">\u30d6\u30e9\u30a6\u30b6\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\uff08browsers.xml\uff09<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!DOCTYPE suite SYSTEM \"https:\/\/testng.org\/testng-1.0.dtd\"&gt;\n&lt;suite name=\"Multi Browser Test Suite\" parallel=\"tests\" thread-count=\"3\"&gt;\n    &lt;test name=\"Chrome Tests\"&gt;\n        &lt;parameter name=\"browser\" value=\"chrome\"\/&gt;\n        &lt;classes&gt;\n            &lt;class name=\"com.example.tests.CrossBrowserTest\"\/&gt;\n        &lt;\/classes&gt;\n    &lt;\/test&gt;\n\n    &lt;test name=\"Firefox Tests\"&gt;\n        &lt;parameter name=\"browser\" value=\"firefox\"\/&gt;\n        &lt;classes&gt;\n            &lt;class name=\"com.example.tests.CrossBrowserTest\"\/&gt;\n        &lt;\/classes&gt;\n    &lt;\/test&gt;\n\n    &lt;test name=\"Edge Tests\"&gt;\n        &lt;parameter name=\"browser\" value=\"edge\"\/&gt;\n        &lt;classes&gt;\n            &lt;class name=\"com.example.tests.CrossBrowserTest\"\/&gt;\n        &lt;\/classes&gt;\n    &lt;\/test&gt;\n&lt;\/suite&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-59\">\u30de\u30eb\u30c1\u30d6\u30e9\u30a6\u30b6\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class CrossBrowserTest {\n    private WebDriver driver;\n    private BrowserFactory browserFactory;\n\n    @BeforeMethod\n    @Parameters(\"browser\")\n    public void setUp(String browser) {\n        browserFactory = new BrowserFactory();\n        driver = browserFactory.createDriver(browser);\n    }\n\n    @Test\n    public void testAcrossMultipleBrowsers() {\n        driver.get(\"https:\/\/example.com\");\n        \/\/ \u30c6\u30b9\u30c8\u5b9f\u88c5\n    }\n\n    @AfterMethod\n    public void tearDown() {\n        if (driver != null) {\n            driver.quit();\n        }\n    }\n}\n\n\/\/ \u30d6\u30e9\u30a6\u30b6\u30d5\u30a1\u30af\u30c8\u30ea\u30fc\u30af\u30e9\u30b9\npublic class BrowserFactory {\n    public WebDriver createDriver(String browserType) {\n        switch (browserType.toLowerCase()) {\n            case \"chrome\":\n                WebDriverManager.chromedriver().setup();\n                return new ChromeDriver();\n            case \"firefox\":\n                WebDriverManager.firefoxdriver().setup();\n                return new FirefoxDriver();\n            case \"edge\":\n                WebDriverManager.edgedriver().setup();\n                return new EdgeDriver();\n            default:\n                throw new IllegalArgumentException(\"Unsupported browser type: \" + browserType);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-60\">\u4e26\u5217\u5b9f\u884c\u306e\u8a2d\u5b9a\uff08pom.xml\uff09<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;build&gt;\n    &lt;plugins&gt;\n        &lt;plugin&gt;\n            &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n            &lt;artifactId&gt;maven-surefire-plugin&lt;\/artifactId&gt;\n            &lt;version&gt;3.2.5&lt;\/version&gt;\n            &lt;configuration&gt;\n                &lt;suiteXmlFiles&gt;\n                    &lt;suiteXmlFile&gt;browsers.xml&lt;\/suiteXmlFile&gt;\n                &lt;\/suiteXmlFiles&gt;\n                &lt;properties&gt;\n                    &lt;property&gt;\n                        &lt;name&gt;parallel&lt;\/name&gt;\n                        &lt;value&gt;methods&lt;\/value&gt;\n                    &lt;\/property&gt;\n                    &lt;property&gt;\n                        &lt;name&gt;threadCount&lt;\/name&gt;\n                        &lt;value&gt;3&lt;\/value&gt;\n                    &lt;\/property&gt;\n                &lt;\/properties&gt;\n            &lt;\/configuration&gt;\n        &lt;\/plugin&gt;\n    &lt;\/plugins&gt;\n&lt;\/build&gt;<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-61\">\u9ad8\u5ea6\u306a\u81ea\u52d5\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>JavaScript\u5b9f\u884c<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6a19\u6e96\u7684\u306aSelenium\u30e1\u30bd\u30c3\u30c9\u3092\u512a\u5148<\/li>\n\n\n\n<li>JavaScript\u306f\u5fc5\u8981\u306a\u5834\u5408\u306e\u307f\u4f7f\u7528<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u9069\u5207\u306b\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30e9\u30fc\u30c8\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3092\u9069\u5207\u306b\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u4f8b\u5916\u51e6\u7406\u3092\u78ba\u5b9f\u306b\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30a2\u30e9\u30fc\u30c8\u306e\u5b58\u5728\u78ba\u8a8d\u3092\u884c\u3046<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30de\u30eb\u30c1\u30d6\u30e9\u30a6\u30b6\u30c6\u30b9\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d6\u30e9\u30a6\u30b6\u56fa\u6709\u306e\u6319\u52d5\u3092\u8003\u616e<\/li>\n\n\n\n<li>\u4e26\u5217\u5b9f\u884c\u6642\u306e\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u7d50\u679c\u306e\u9069\u5207\u306a\u96c6\u7d04<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"i-62\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-63\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\uff1a\u5b9f\u4f8b\u30d9\u30fc\u30b9\u3067\u89e3\u8aac<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-64\">1. \u8981\u7d20\u7279\u5b9a\u306e\u554f\u984c<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ElementTroubleshooting {\n    private WebDriver driver;\n    private WebDriverWait wait;\n\n    \/\/ StaleElementReferenceException\u5bfe\u7b56\n    public void handleStaleElement(By locator, Consumer&lt;WebElement&gt; action) {\n        int maxAttempts = 3;\n        int attempts = 0;\n        while (attempts &lt; maxAttempts) {\n            try {\n                WebElement element = wait.until(\n                    ExpectedConditions.presenceOfElementLocated(locator)\n                );\n                action.accept(element);\n                break;\n            } catch (StaleElementReferenceException e) {\n                attempts++;\n                if (attempts == maxAttempts) {\n                    throw e;\n                }\n            }\n        }\n    }\n\n    \/\/ ElementClickInterceptedException\u5bfe\u7b56\n    public void safeClick(WebElement element) {\n        try {\n            element.click();\n        } catch (ElementClickInterceptedException e) {\n            \/\/ \u30b9\u30af\u30ed\u30fc\u30eb\u3057\u3066\u8981\u7d20\u3092\u8868\u793a\n            ((JavascriptExecutor) driver).executeScript(\n                \"arguments[0].scrollIntoView(true);\", \n                element\n            );\n            \/\/ \u5c11\u3057\u5f85\u6a5f\n            try {\n                Thread.sleep(500);\n            } catch (InterruptedException ie) {\n                Thread.currentThread().interrupt();\n            }\n            \/\/ JavaScript\u7d4c\u7531\u3067\u30af\u30ea\u30c3\u30af\n            ((JavascriptExecutor) driver).executeScript(\n                \"arguments[0].click();\", \n                element\n            );\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-65\">2. \u30bf\u30a4\u30df\u30f3\u30b0\u95a2\u9023\u306e\u554f\u984c<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class TimingHandler {\n    private WebDriver driver;\n    private WebDriverWait wait;\n\n    \/\/ \u52d5\u7684\u8981\u7d20\u306e\u5f85\u6a5f\n    public WebElement waitForDynamicElement(By locator) {\n        return wait.until(ExpectedConditions.refreshed(\n            ExpectedConditions.presenceOfElementLocated(locator)\n        ));\n    }\n\n    \/\/ AJAX\u5b8c\u4e86\u306e\u5f85\u6a5f\n    public void waitForAjaxComplete() {\n        wait.until(driver -&gt; {\n            JavascriptExecutor js = (JavascriptExecutor) driver;\n            return (Boolean) js.executeScript(\n                \"return jQuery.active == 0\"\n            );\n        });\n    }\n\n    \/\/ \u30da\u30fc\u30b8\u30ed\u30fc\u30c9\u5b8c\u4e86\u306e\u5f85\u6a5f\n    public void waitForPageLoad() {\n        wait.until(driver -&gt; ((JavascriptExecutor) driver)\n            .executeScript(\"return document.readyState\")\n            .equals(\"complete\"));\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-66\">\u30c6\u30b9\u30c8\u5b9f\u884c\u306e\u5b89\u5b9a\u6027\u3092\u9ad8\u3081\u308b7\u3064\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-67\">1. \u30ea\u30c8\u30e9\u30a4\u30e1\u30ab\u30cb\u30ba\u30e0\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class RetryMechanism implements IRetryAnalyzer {\n    private int retryCount = 0;\n    private static final int MAX_RETRY_COUNT = 3;\n\n    @Override\n    public boolean retry(ITestResult result) {\n        if (retryCount &lt; MAX_RETRY_COUNT) {\n            retryCount++;\n            return true;\n        }\n        return false;\n    }\n}\n\n\/\/ \u30c6\u30b9\u30c8\u30af\u30e9\u30b9\u3067\u306e\u4f7f\u7528\u4f8b\n@Test(retryAnalyzer = RetryMechanism.class)\npublic void unstableTest() {\n    \/\/ \u30c6\u30b9\u30c8\u5b9f\u88c5\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-68\">2. \u30ab\u30b9\u30bf\u30e0\u30a6\u30a7\u30a4\u30c8\u51e6\u7406<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class CustomWaits {\n    private WebDriver driver;\n\n    public void waitForCondition(Function&lt;WebDriver, Boolean&gt; condition, \n                               String message) {\n        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));\n        wait.withMessage(message)\n            .pollingEvery(Duration.ofMillis(500))\n            .ignoring(StaleElementReferenceException.class)\n            .until(condition);\n    }\n\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u6761\u4ef6\u306e\u4f8b\n    public void waitForElementToBeStable(WebElement element) {\n        Point initialLocation = element.getLocation();\n        waitForCondition(driver -&gt; {\n            Point currentLocation = element.getLocation();\n            return currentLocation.equals(initialLocation);\n        }, \"Element location is not stable\");\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-69\">3. \u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u7ba1\u7406<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ScreenshotManager {\n    private WebDriver driver;\n\n    public void captureScreenshot(String testName, String status) {\n        try {\n            TakesScreenshot ts = (TakesScreenshot) driver;\n            File source = ts.getScreenshotAs(OutputType.FILE);\n            String timestamp = new SimpleDateFormat(\"yyyyMMdd_HHmmss\")\n                .format(new Date());\n            String fileName = String.format(\n                \"screenshot_%s_%s_%s.png\",\n                testName,\n                status,\n                timestamp\n            );\n            FileUtils.copyFile(\n                source, \n                new File(\"test-output\/screenshots\/\" + fileName)\n            );\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-70\">4. \u30ed\u30b0\u7ba1\u7406\u306e\u5f37\u5316<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class TestLogger {\n    private static final Logger logger = LogManager.getLogger(TestLogger.class);\n\n    public static void logTestStep(String step) {\n        logger.info(\"\u5b9f\u884c\u30b9\u30c6\u30c3\u30d7: \" + step);\n    }\n\n    public static void logError(String message, Exception e) {\n        logger.error(\"\u30a8\u30e9\u30fc\u767a\u751f: \" + message, e);\n    }\n\n    public static void logTestResult(String testName, String result) {\n        logger.info(String.format(\n            \"\u30c6\u30b9\u30c8\u7d50\u679c - %s: %s\",\n            testName,\n            result\n        ));\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-71\">\u5b89\u5b9a\u6027\u5411\u4e0a\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c6\u30b9\u30c8\u74b0\u5883\u306e\u6a19\u6e96\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d6\u30e9\u30a6\u30b6\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u7d71\u4e00<\/li>\n\n\n\n<li>\u30b9\u30af\u30ea\u30fc\u30f3\u89e3\u50cf\u5ea6\u306e\u56fa\u5b9a<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u72ec\u7acb\u6027\u78ba\u4fdd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5f37\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u306e\u9069\u5207\u306a\u30ad\u30e3\u30c3\u30c1<\/li>\n\n\n\n<li>\u30ea\u30c8\u30e9\u30a4\u30ed\u30b8\u30c3\u30af\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u8a73\u7d30\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u8981\u306a\u5f85\u6a5f\u6642\u9593\u306e\u524a\u6e1b<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/li>\n\n\n\n<li>\u4e26\u5217\u5b9f\u884c\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u306e\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u306e\u5b9a\u671f\u7684\u306a\u30ea\u30d5\u30a1\u30af\u30bf\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u5171\u901a\u51e6\u7406\u306e\u62bd\u8c61\u5316<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u306e\u5916\u90e8\u5316<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Selenium\u3068\u306f\uff1fJava\u3067\u306e\u81ea\u52d5\u30c6\u30b9\u30c8\u3092\u59cb\u3081\u308b\u524d\u306b Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_htm &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":{"0":"post-1200","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1200","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1200"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1200\/revisions"}],"predecessor-version":[{"id":1201,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1200\/revisions\/1201"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1200"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1200"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}