如何通过“一个类”或“跨度类”查找元素?

时间:2019-01-03 11:04:35

标签: java selenium

我试图单击一个元素,但总是收到错误“无法使用..定位元素”。 我已经尝试通过类,csselector和XPath进行查找。我也先尝试了一个class,然后再尝试了span class元素,但是它仍然无法正常工作。绝对也是正确的框架。 这真的很奇怪,因为它已经在两个星期前工作了,我没有更改代码中的任何内容,现在却无法工作。元素可能会不断变化吗?如果是这样,我如何确保它仍然可以找到元素而无需每次都调整代码?

<a class="ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all" href="#" aria-label="Close" role="button">  
 <span class="ui-icon ui-icon closethick">
  ::after
 </span>
</a>

这是我当前的当前代码,仍然无法使用:

driver.switchTo().defaultContent();
    driver.switchTo().frame("frame_vehicleFileTab");
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    WebElement closePrint = (new WebDriverWait(driver, 10)).until(
            ExpectedConditions.elementToBeClickable(By.xpath("//*[@aria-label='Close']")));
    closePrint.click();

通过搜索以下元素尝试DebanjanB的建议之后:

driver.findElement(By.xpath("//a[@class='ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all' and @aria-label='Close']")).click();

我收到此错误:org.openqa.selenium.ElementNotInteractableException:元素无法滚动到视图中

更新:我通过获取Firefox的Selenium IDE扩展,然后选择了由该扩展生成的xpath以及javascript执行程序来修复了该问题:

WebElement closePrint = (new WebDriverWait(driver, 10)).until(
            ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='FileTab:Form:j_id674351400_da78919']/div/a/span")));
    JavascriptExecutor js1 = (JavascriptExecutor)driver;
    js1.executeScript("arguments[0].click();", closePrint);

我不知道为什么xpath现在可以工作,但我很高兴它能工作。谢谢大家的建议!

3 个答案:

答案 0 :(得分:1)

通过<span>标签定位该元素非常困难,因为它是 pseudo 元素。要查找元素,可以使用以下Locator Strategies中的任何一个:

  • cssSelector

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("a.ui-dialog-titlebar-icon.ui-dialog-titlebar-close.ui-corner-all[aria-label='Close']"))).click();
    
  • xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all' and @aria-label='Close']"))).click();
    

答案 1 :(得分:0)

据我所提供的HTML所见:

您可以将By.XPATH用于以下XPATH:"//*[@aria-label='Close']"

赞:

d.findElement(By.xpath("//*[@aria-label='Close']")).click();

编辑:

尝试将Actions与“偏移量”结合使用,如果有覆盖元素的元素,这会很有帮助,这在iFrame中会发生。

这是一个代码片段:

WebElement closePrint = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all' and @aria-label='Close']")));

int width = closePrint.getSize().getWidth();

Actions clicker= new Actions(driver);
act.moveToElement(closePrint).moveByOffset((width/2)-2, 0).click().perform();

希望这对您有帮助!

答案 2 :(得分:0)

除了DebanjanB的建议之外,我还建议您使用下面的JavaScript实用工具向下滚动直到该元素可见。

WebElement element = driver.findElement(By.xpath("//a[@class='ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all' and @aria-label='Close']"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);