首页 > 解决方案 > Selenium:ElementNotVisibleException 尝试在 https://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("user@phptravels.com");
    password.sendKeys("demouser");
    loginBtn.click();
}

标签: javaseleniumselenium-webdriverxpathwebdriverwait

解决方案


修改代码如下:

在您的 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));

或者

像下面这样对 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='nav navbar-nav navbar-right']/ul/li[1]/a


推荐阅读