等待页面元素(xpath)在Selenium Webdriver中显示的最有效方法是什么?

时间:2018-05-18 12:28:36

标签: java selenium xpath performance-testing

我正在使用Java和Selenium Webdriver来测试单页Web应用程序的功能。

因此,显然,元素会动态地从DOM中注入和删除。

我知道我可以使用类似的代码使用WebDriverWait等待一个元素存在于DOM中(我编写的非常简洁的模板略有改变GitHub):

public void waitForElement() throws Exception {
    /*
    Inject the following snippet in any web page to test the method
    <button class="i-am-your-class" onclick="alert('Wow, you pressed the button!');">Press me</button>
     */
    System.setProperty("webdriver.gecko.driver", "C:\\Program Files (x86)\\Mozilla Firefox\\geckodriver.exe");
    WebDriver driver = getDriver();
    WebDriverWait wait = new WebDriverWait(driver, 10); // 10 can be reduced as per Test Specifications
    driver.get("http://www.google.com");
    WebElement response = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@class='i-am-your-class']")));
    response.click();
    System.out.println("*****************************************************************************");
    System.out.println(response);
    System.out.println(response.getText());

    driver.close();
}

我想知道的是,这也是使用xpath获得此类结果的更有效方法。

我一直在研究Stackoverflow,但有几个答案指向了类似的方向,但没有答案专注于效率/性能:

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:2)

您需要考虑以下几个事实:

  • WebDriverWait() 100 不应该是实时服务员。请考虑根据测试规范减少它。例如,将其设置为10秒:

    WebDriverWait wait = new WebDriverWait(driver, 10);
    
  • 在您调用click()方法时向前移动,而不是 ExpectedConditions 作为visibilityOfElementLocated()方法使用elementToBeClickable()方法,如下所示:

    WebElement response = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@class='i-am-your-class']")));
    
  • 优化 xpath ,包括 tagName ,如By.xpath("//tagName[@class='i-am-your-class']")中所示。举个例子:

    By.xpath("//a[@class='i-am-your-class']")
    
  • 通过 WebDriverWait 返回元素后,优化代码以调用click(),如下所示:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='i-am-your-class']"))).click();
    

答案 1 :(得分:1)

我不知道你说的是什么原因 XPATH 是首选。我想补充一些关于定位器的内容。

您在代码中编写的 XPATH 可以轻松替换为css selector。这是一个例子。

div[class='i-am-your-class']  

现在主要的问题是为什么要切换到不同的定位器?

  • 效率更高。
  • 与xpath相比更快。
  • 更可靠。
  • 更多表现。

您应始终按照 Selenium贡献者

建议的顺序使用定位器
  1. ID
  2. 命名
  3. 的className
  4. LINKTEXT
  5. partialLinkText
  6. 的tagName
  7. cssSelector
  8. 的XPath 即可。
  9. 注意:大多数时候cssSelector可以替换Xpath,但是Xpath有自己的优点,cssSelector不提供。

    如需更多参考,您可以浏览此SO链接:Xpath vs Css selector