java - 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();
}
解决方案
修改代码如下:
在您的 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
推荐阅读
- php - 照明路由的多个可选路径前缀段
- mule-studio - 如何编写动态属性
- azure - 使用 azure oauth2 验证服务到服务身份验证中的访问令牌
- laravel - Api.php 不适用于 Google Dialogflow webhook
- python - 用 setPixel 改变像素颜色
- powershell - PowerShell中的'@{}'是什么意思
- r - 在 Rstudio 中运行旧版本的 R
- ios - 关联类型的依赖注入导致 Swift 中没有类型名称的参数(取消标记)
- python - 如何根据 for 循环内列的唯一值对 pandas 数据帧进行切片并将每个切片传递给函数?
- angular - 链接操作(基于 DOM)的安全问题 - Angular 7 应用程序