Selenium Webdriver:元素不可见异常
Selenium Webdriver: Element Not Visible Exception
这是我的代码,用于单击此 Website
上的简单登录按钮
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Reports {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("https://platform.drawbrid.ge");
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
driver.findElement(By.xpath(".//*[@id='_loginButton']")).click();
}
}
我收到以下错误:
Exception in thread "main" org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with
Command duration or timeout: 2.05 seconds
您在此页面上有两个具有给定 xpath 的按钮,第一个不可见,这就是您收到 ElementNotVisibleException 的原因
一个在<div class="loginPopup">
下
第二个(您需要的那个)在 <div class="page">
下
因此,将您的 xpath 更改为如下所示,它将解决您的问题:
By.xpath("//div[@class='page']//div[@id='_loginButton']")
页面上什至有 3 个带有 id="_loginButton"
的元素,只有一个可见 - 位于登录表单内的那个,您可以通过CSS 选择器:
By.cssSelector("form#_loginForm div#_loginButton")
出现了 3 次id="_loginButton"
。
使用 cssSelector class="signIn"
下的 id="_loginButton"
获取页面中的确切按钮。
By.cssSelector("div.signIn div#_loginButton")
Webdriver
可能会抛出 ElementNotVisible
异常,以防有多个元素具有相同的定位器,并且如果 Webdriver
已经对与定位器匹配的元素之一进行操作。
在这种情况下,您可以先使用
获取元素的大小
int var_ele_size= driver.findElements(By.xpath("locator")).size();
然后从列表中取出第一个元素并单击该元素。
driver.findElements(By.xpath("locator")).get(var_ele_size-1).click();
public static void Listget (WebDriver driver) throws Exception
{
Thread.sleep(5000);
UtilityMethod.getAppLocaters(driver, "closeicon").click();
Actions action = new Actions(driver);
WebElement we = driver.findElement(By.xpath("//li[@class='parent dropdown aligned-left']"));
Thread.sleep(5000);
action.moveToElement(we).build().perform();
List<WebElement>links = driver.findElements(By.xpath("//span[@class='menu-title']"));
int total_count = links.size();
System.out.println("Total size :=" +total_count);
for(int i=0;i<total_count;i++)
{
WebElement element = links.get(i);
String text = element.getAttribute("innerHTML");
System.out.println("linksnameis:=" +text);
try{
File src = new File("D:ReadFile.xlsx");
FileInputStream fis = new FileInputStream(src);
XSSFWorkbook wb=new XSSFWorkbook(fis);
XSSFSheet sh = wb.getSheetAt(0);
sh.createRow(i).createCell(1).setCellValue(text);
FileOutputStream fos = new FileOutputStream(new File("D:/ReadFile.xlsx"));
wb.write(fos);
fos.close();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
}
确保 remote server
上的 window 足够大,这样元素就不会因为 space 限制而被隐藏..
这对我有用:(我使用 c#
)
driver.Manage().Window.Size = new System.Drawing.Size(1928, 1060);
你可以试试:
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("your locator value")));
或者
wait.until(ExpectedConditions.ElementIsVisible(By.xpath("your locator value")));
这是我的代码,用于单击此 Website
上的简单登录按钮import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Reports {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("https://platform.drawbrid.ge");
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
driver.findElement(By.xpath(".//*[@id='_loginButton']")).click();
}
}
我收到以下错误:
Exception in thread "main" org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with Command duration or timeout: 2.05 seconds
您在此页面上有两个具有给定 xpath 的按钮,第一个不可见,这就是您收到 ElementNotVisibleException 的原因
一个在<div class="loginPopup">
第二个(您需要的那个)在 <div class="page">
因此,将您的 xpath 更改为如下所示,它将解决您的问题:
By.xpath("//div[@class='page']//div[@id='_loginButton']")
页面上什至有 3 个带有 id="_loginButton"
的元素,只有一个可见 - 位于登录表单内的那个,您可以通过CSS 选择器:
By.cssSelector("form#_loginForm div#_loginButton")
出现了 3 次id="_loginButton"
。
使用 cssSelector class="signIn"
下的 id="_loginButton"
获取页面中的确切按钮。
By.cssSelector("div.signIn div#_loginButton")
Webdriver
可能会抛出 ElementNotVisible
异常,以防有多个元素具有相同的定位器,并且如果 Webdriver
已经对与定位器匹配的元素之一进行操作。
在这种情况下,您可以先使用
获取元素的大小int var_ele_size= driver.findElements(By.xpath("locator")).size();
然后从列表中取出第一个元素并单击该元素。
driver.findElements(By.xpath("locator")).get(var_ele_size-1).click();
public static void Listget (WebDriver driver) throws Exception
{
Thread.sleep(5000);
UtilityMethod.getAppLocaters(driver, "closeicon").click();
Actions action = new Actions(driver);
WebElement we = driver.findElement(By.xpath("//li[@class='parent dropdown aligned-left']"));
Thread.sleep(5000);
action.moveToElement(we).build().perform();
List<WebElement>links = driver.findElements(By.xpath("//span[@class='menu-title']"));
int total_count = links.size();
System.out.println("Total size :=" +total_count);
for(int i=0;i<total_count;i++)
{
WebElement element = links.get(i);
String text = element.getAttribute("innerHTML");
System.out.println("linksnameis:=" +text);
try{
File src = new File("D:ReadFile.xlsx");
FileInputStream fis = new FileInputStream(src);
XSSFWorkbook wb=new XSSFWorkbook(fis);
XSSFSheet sh = wb.getSheetAt(0);
sh.createRow(i).createCell(1).setCellValue(text);
FileOutputStream fos = new FileOutputStream(new File("D:/ReadFile.xlsx"));
wb.write(fos);
fos.close();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
}
确保 remote server
上的 window 足够大,这样元素就不会因为 space 限制而被隐藏..
这对我有用:(我使用 c#
)
driver.Manage().Window.Size = new System.Drawing.Size(1928, 1060);
你可以试试:
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("your locator value")));
或者
wait.until(ExpectedConditions.ElementIsVisible(By.xpath("your locator value")));