My Accountとしてテキストを含む要素をクリックしようとしている間Selenium:ElementNotVisibleException://www.phptravels.net/

phptravel のウェブサイトをテストし、[ myaccount ]リンクをクリックしてみたコード。 Seleniumは実行中に ElementNotVisibleException を返します。私が逃したことは何ですか?

ソースコード

public void login(WebDriver driver) {
    driver.navigate().to("https://www.phptravels.net/");
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("/html/body/nav/div/div[1]/a")));
   //Error on here 
    myAccount.click();
    WebDriverWait myAccountWait = new WebDriverWait(driver, 10);
    myAccountWait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"li_myaccount\"]/ul")));
    loginLink.click();
    WebDriverWait loginWait = new WebDriverWait(driver, 10);
    //loginWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\\\"loginfrm\\\"]/div[1]/div[5]/div/div[1]/input")));
    username.sendKeys("[email protected]");
    password.sendKeys("demouser");
    loginBtn.click();
}
5
10秒は十分に長いと考えられます。 Seleniumの実行は非常に速いものです。
追加された 著者 peterwkc,
コンソールを例外情報と共有できますか
追加された 著者 Ashok kumar,
この投稿は、meta 投稿 cc @Rajagopalan
追加された 著者 Suraj Rao,
myAccountはどこで初期化されますか?
追加された 著者 Jeremy Kahan,
チェック待ち時間を増やすことはできますか
追加された 著者 Ankur Singh,

5 答え

visibilityOfElementLocated()の代わりに私のアカウントとしてテキストを持つ要素をクリック()するには、 WebDriverWait を誘導する必要があります elementToBeClickable() メソッドを使用して、次の解決策を使用できます。

  • Code Block:

    System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
    WebDriver driver=new FirefoxDriver();
    driver.get("http://www.phptravels.net");
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//nav[@class='navbar navbar-default']//li[@id='li_myaccount']/a[normalize-space()='My Account']"))).click();
    
  • Browser Snapshot:

php_travels_login_click

3
追加された
2つの質問:1.どのようにしてXpathを取得しますか?どうして私と違うの? 2.クリックメソッドを連鎖させて作業は完了するが、要素をクリックしても作動しないのはなぜですか。
追加された 著者 peterwkc,
@peterwkc Answers:1.どこにでも既製の最適化された xpath は手に入らず、一般的な HTML DOM に従って記述する必要があります。 2.技術的には、これはメソッドチェーンではなく、 ExpectedConditions elementToBeClickable() WebElement を返すので、 clickを呼び出すようにコードを最適化しました。追加行なしで直接()あなたがさらに質問があるかどうか私に知らせてください。
追加された 著者 DebanjanB,

以下のようにコードを変更します。

あなたのWebDriverWait上で By タイプで以下のようにxpathを保存してください:

By myAccountBy = By.xpath("//ul[@class='nav navbar-nav navbar-right']/ul/li[1]/a");

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(myAccountBy));

OR

以下のようにxpathをハードコードします。

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.Xpath("//ul[@class='nav navbar-nav navbar-right']/ul/li[1]/a")));

次に、 myAccount WebElementに同じxpathを以下のように付けます。

@FindBy(xpath="//ul[@class='nav navbar-nav navbar-right']/ul/li[1]/a")
public WebElement myAccount;

つまり、MyAccountをクリックするには、このxpathを保持する必要があります。

//ul [@ class = 'ナビゲーションナビゲーションバー - ナビゲーションナビゲーション - 右']/ul/li [1]/a

0
追加された

最初に WebElement を作成し、次に elementToBeClickable Expected Conditionを使用して問題を解決する必要があります。

WebElement myAccount = driver.findElement("Your locator");

今すぐ wait を使用してください

WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(myAccount));
myAccount.click(); 

またブラウザを最大化します。

0
追加された

myAccount webElementがコード内で初期化されていません。

マイアカウントのリンクをクリックしたい場合は、これを使用できます。

WebElement myAccount = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='collapse']/descendant::ul[3]/li[@id='li_myaccount']/a")));
myAccount.click();  

テキストノードであるため、リンクテキストを使用することはできません。

0
追加された

URLをロードした後に明示的な待機を追加することが常にベストプラクティスです。下記の修正されたXPathに基づいてアカウントのリンクをクリックすることができます。

Xpath: //nav//li[@id='li_myaccount']//a

ワーキングコード:

    driver.get("https://www.phptravels.net/");

    WebDriverWait wait=new WebDriverWait(driver,10);
    //wait is added in order to complete the page loading
    wait.until(ExpectedConditions.titleContains("PHPTRAVELS"));

    driver.findElement(By.xpath("//nav//li[@id='li_myaccount']//a")).click();
0
追加された