Chromeへの接続がタイムアウトし、再試行しています…Seleniumを介してChromeDriver2.43とChromeを使用するとエラーが発生します
正直なところ、この時点で何をすべきかさえわかりません。コンソールにエラーログが表示されず、スクリプトに入力したロガーメッセージだけが表示されます。
ダッシュボードコンストラクターを作成するコード行に到達すると、テストが終了し、失敗を宣言します。最後にログに記録されたメッセージは、常に「検索を開始しようとしています」です。
この質問を投稿する前に、コンストラクター全体を完全に削除し(すべてのコードをコメントアウトし、ドライバーパラメーターを削除し、printステートメントを挿入しただけです)、クラス内でprintメソッドを呼び出すと、スクリプトが次の行で失敗しました。コンストラクターが発生しました。
私は何が起こっているのか理解していません私は非常に明白な何かを見逃している可能性があります。失敗しますが、コンソールにも特定のエラーメッセージが表示されるとは限りません。
実行しようとしているテストケースは次のとおりです。
package com.symphio.testCases;
import java.util.concurrent.TimeUnit;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.symphio.pageObjects.Dashboard;
import com.symphio.pageObjects.loginSymphio;
public class TC_Dashboard_Search_002 extends BaseClass{
@Test
public void searchForTile() throws InterruptedException {
logger.info("Connected to "+ baseURL);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
loginSymphio login = new loginSymphio(driver);
//logs in
login.setUserName(userName);
logger.info("entered username");
login.setPassWord(passWord);
logger.info("entered password");
login.pressSubmit();
logger.info("button pressed");
//searches for tile
Thread.sleep(3000);
logger.info("about to start looking");
Dashboard dashboard = new Dashboard(driver);
dashboard.mouseMover();
logger.info("found Icon");
dashboard.searchBarText(searchText);
logger.info("input text");
dashboard.tileClick();
logger.info("clicked");
}
}
これが私のダッシュボードpageObjectです
package com.symphio.pageObjects;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Dashboard {
WebDriver driver;
public Dashboard(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
@FindBy(className="search-container")
WebElement searchImg;
@FindBy(xpath="//input[@type='search']")
WebElement searchText;
@FindBy(xpath="//input[contains(@class,'mat-card'), and contains(@class, 'mat-focus-indicator'), and contains(@class, 'arrangement-card')]")
WebElement tileBox;
Actions actions = new Actions(driver);
public void mouseMover() {
Actions mouseOverOnElement = actions.moveToElement(searchImg);
mouseOverOnElement.perform();
}
public void searchBarText(String text) {
searchText.sendKeys(text);
}
public void tileClick() {
tileBox.click();
}
}
コンソールエラー:
回答
このエラーメッセージ...
...[WARNING]: Timed out connecting to Chrome, retrying...
...org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
...それがあることを意味を意味ChromeDriver /グーグル・クロームの現在の実装として使用しているコンボは最近のものではありませんChromeDriverは以下のwebdriverをW3Cの仕様と初期のログが反映されます。
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
Nov 05, 2019 3:41:53 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
したがって、主な問題は、使用しているバイナリのバージョン間の非互換性です。
- chromedriver = 2.43を使用しています
- chromedriver = 2.43のリリースノートには、次のことが明確に記載されています。
Chromev69-71をサポート
- おそらく、最新のchrome = 84.0を使用しています
- ChromeDriver v84.0のリリースノートには、次のことが明確に記載されています。
Chromeバージョン84をサポート
そのため、ChromeDriverv2.43とChromeブラウザv84.0の間には明らかな不一致があります
解決
確認しておいて:
- JDKは現在のレベルのJDK8u251にアップグレードされます。
- セレンは現在のレベルバージョン3.141.59にアップグレードされます。
- ChromeDriverは、現在のChromeDriverv84.0レベルに更新されます。
- Chromeは現在のChromeバージョン84.0レベルに更新されます。(ChromeDriver v84.0リリースノートによる)
- ベースのWebクライアントのバージョンが古すぎる場合は、それをアンインストールして、最新のGAとリリースされたバージョンのWebクライアントをインストールします。
- きれいにあなたのプロジェクトワークスペースをごを通じてIDEおよび再構築のみ必要な依存関係を持つプロジェクトを。
- テイクシステムの再起動を。
- root以外のユーザー
@Test
として実行します。 - 常にメソッド
driver.quit()
内を呼び出してtearDown(){}
、WebDriverインスタンスとWebクライアントインスタンスを正常に閉じて破棄します。
参照
関連する詳細なディスカッションがいくつかあります。
- ポステルの法則がリモートエンドに当てはまると仮定して、バイダイアレクトセッションを試行し、ChromeDriverとSeleniumを使用して元のOSSJSONにフォールバックする
ここでの問題は、ドライバーがDashBoardクラスでまだ初期化されていないことだと思います。
DashBoardをBaseClassに拡張してみてください。
public class Dashboard extends BaseClass {
public Dashboard(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}