如何处理子链接 --"stale element reference: element is not attached to the page document"
How to Handing sub-links --"stale element reference: element is not attached to the page document"
Objective : 逐一单击子link 并验证页面是否存在的脚本
场景:
当我将鼠标悬停在类别 Link 上时 -- 它会在右侧显示子类别 Links(List) :
当我收回悬停时 - links(List) 没有显示 :
自动化:
我试图将鼠标悬停在类别 link 上!!
从而捕获了类别 link 的 Xpath!
将鼠标悬停应用动作!!
鼠标悬停在 0 索引(开始)处捕获 Sub links 的 x 路径!
应用"For Each loop"(高级For循环)将子link x路径一一捕获!!
在上面的 for 循环中,使用 "action" 来点击子 link!!
问题:它单击索引 0 处的子 - link,在以后的迭代中它无法捕获子 - link,即使鼠标悬停在类别 link完成了...
如何在第二次、第三次........迭代中获得子link..
代码如下:
public static WebElement Add_EditCorpUser(WebDriver driver) throws InterruptedException
{
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
Actions action = new Actions(driver);
element=driver.findElement(By.xpath(".//td[@title='Security Admin']/following::td[1]/span[contains(text(),'Security')]"));
action.moveToElement(element).build().perform();
List<WebElement> arrayList=driver.findElements(By.xpath(".//table[@class='hideHeader']//span[@id='subMenu']//div[@id='i_2sub']//tbody/tr"));
List<String> linksname = new ArrayList<>();
for (WebElement w:arrayList) {
linksname.add(w.getText());
System.out.println("value ---------------- --"+ linksname);
action.moveToElement(w).click().build().perform();
Thread.sleep(10000);
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
action.moveToElement(driver.findElement(By.xpath(".//td[@title='Security Admin']/following::td[1]/span[contains(text(),'Security')]"))).build().perform();
Thread.sleep(10000);
}
-------------------------------------------- ---------------------------------------------- ---------------------------------------------- --------------------------------根据评论修改代码------------ ----------
public static WebElement element=null;
public static WebElement Add_EditCorpUser(WebDriver driver) throws InterruptedException
{
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
Actions action = new Actions(driver);
element=driver.findElement(By.xpath(".//td[@title='Security Admin']/following::td[1]/span[contains(text(),'Security')]"));
action.moveToElement(element).build().perform();
List<WebElement> arrayList=driver.findElements(By.xpath(".//table[@class='hideHeader']//span[@id='subMenu']//div[@id='i_2sub']//tbody/tr"));
String[] xpa=new String[arrayList.size()];
for(int i=1;i<arrayList.size();i++)
{
xpa[i]="\".//table[@class='hideHeader']//span[@id='subMenu']//div[@id='i_2sub']//tbody/tr["+i+"]\"";
}
for(String a: xpa )
{
if(a!=null){
System.out.println(a);
action.moveToElement(driver.findElement(By.xpath(a))).click().build().perform();
Thread.sleep(10000);
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
System.out.println("Switched to new frame");
action.moveToElement(element).build().perform();
}
当您搜索一个元素并且在对其执行任何操作之前,页面有 changed/reloaded.
在页面中执行任何操作之前,请确保页面已完全加载。
先等待页面加载 -> 然后找到元素并执行操作。
如果您将所有链接保存在一个数组中,并且您想要单击其中的每一个,那将不起作用。
您需要有一个包含链接选择器的数组,并在您的 for 循环中使用该数组。
在第二个代码中你有无效的选择器,你有额外的双重 quotes.try
xpa[i]="//table[@class='hideHeader']//span[@id='subMenu']//div[@id='i_2sub']//tbody/tr["+i+"]";
请记住 xpath 是一个字符串,使用连接,打印字符串并在浏览器中检查它并更新以获得有效的 xpath。
Objective : 逐一单击子link 并验证页面是否存在的脚本
场景: 当我将鼠标悬停在类别 Link 上时 -- 它会在右侧显示子类别 Links(List) :
当我收回悬停时 - links(List) 没有显示 :
自动化: 我试图将鼠标悬停在类别 link 上!! 从而捕获了类别 link 的 Xpath! 将鼠标悬停应用动作!! 鼠标悬停在 0 索引(开始)处捕获 Sub links 的 x 路径! 应用"For Each loop"(高级For循环)将子link x路径一一捕获!! 在上面的 for 循环中,使用 "action" 来点击子 link!!
问题:它单击索引 0 处的子 - link,在以后的迭代中它无法捕获子 - link,即使鼠标悬停在类别 link完成了...
如何在第二次、第三次........迭代中获得子link..
代码如下:
public static WebElement Add_EditCorpUser(WebDriver driver) throws InterruptedException
{
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
Actions action = new Actions(driver);
element=driver.findElement(By.xpath(".//td[@title='Security Admin']/following::td[1]/span[contains(text(),'Security')]"));
action.moveToElement(element).build().perform();
List<WebElement> arrayList=driver.findElements(By.xpath(".//table[@class='hideHeader']//span[@id='subMenu']//div[@id='i_2sub']//tbody/tr"));
List<String> linksname = new ArrayList<>();
for (WebElement w:arrayList) {
linksname.add(w.getText());
System.out.println("value ---------------- --"+ linksname);
action.moveToElement(w).click().build().perform();
Thread.sleep(10000);
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
action.moveToElement(driver.findElement(By.xpath(".//td[@title='Security Admin']/following::td[1]/span[contains(text(),'Security')]"))).build().perform();
Thread.sleep(10000);
}
-------------------------------------------- ---------------------------------------------- ---------------------------------------------- --------------------------------根据评论修改代码------------ ----------
public static WebElement element=null;
public static WebElement Add_EditCorpUser(WebDriver driver) throws InterruptedException
{
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
Actions action = new Actions(driver);
element=driver.findElement(By.xpath(".//td[@title='Security Admin']/following::td[1]/span[contains(text(),'Security')]"));
action.moveToElement(element).build().perform();
List<WebElement> arrayList=driver.findElements(By.xpath(".//table[@class='hideHeader']//span[@id='subMenu']//div[@id='i_2sub']//tbody/tr"));
String[] xpa=new String[arrayList.size()];
for(int i=1;i<arrayList.size();i++)
{
xpa[i]="\".//table[@class='hideHeader']//span[@id='subMenu']//div[@id='i_2sub']//tbody/tr["+i+"]\"";
}
for(String a: xpa )
{
if(a!=null){
System.out.println(a);
action.moveToElement(driver.findElement(By.xpath(a))).click().build().perform();
Thread.sleep(10000);
driver.switchTo().defaultContent();
driver.switchTo().frame(1);
System.out.println("Switched to new frame");
action.moveToElement(element).build().perform();
}
当您搜索一个元素并且在对其执行任何操作之前,页面有 changed/reloaded.
在页面中执行任何操作之前,请确保页面已完全加载。 先等待页面加载 -> 然后找到元素并执行操作。
如果您将所有链接保存在一个数组中,并且您想要单击其中的每一个,那将不起作用。
您需要有一个包含链接选择器的数组,并在您的 for 循环中使用该数组。
在第二个代码中你有无效的选择器,你有额外的双重 quotes.try
xpa[i]="//table[@class='hideHeader']//span[@id='subMenu']//div[@id='i_2sub']//tbody/tr["+i+"]";
请记住 xpath 是一个字符串,使用连接,打印字符串并在浏览器中检查它并更新以获得有效的 xpath。