Как наиболее эффективно дождаться появления элемента страницы (xpath) в Selenium Webdriver? - PullRequest
0 голосов
/ 18 мая 2018

Я использую Java и Selenium Webdriver для тестирования функциональности одностраничного веб-приложения.

По этой причине очевидно, что элементы внедряются и удаляются из DOM динамически.

Я знаю, что могу подождать, пока элемент появится в DOM, используя аналогичный код, который использует WebDriverWait (очень аккуратный шаблон, который я написал, слегка изменив 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 голосов
/ 18 мая 2018

Я не знаю, по какой причине вы сказали, что XPATH является предпочтительным.Я хотел бы добавить кое-что о локаторах.

XPATH , который вы написали в своем коде, можно легко заменить на css selector.Вот пример.

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

Теперь главный вопрос: почему вы хотите переключаться на разные локаторы?

  • больше эффективности.
  • быстрее по сравнению с xpath.
  • более надежно.
  • больше производительности.

Вы всегда должны использовать локаторы в этом порядке, как это предложено Селенхоторителей

  1. ID
  2. name
  3. className
  4. linkText
  5. partalLinkText
  6. tagName
  7. cssSelector
  8. XPath .

Примечание : Большую часть времени cssSelector может заменить Xpath, однако Xpath имеет свои преимущества, которые не предоставляет cssSelector.

Для получения дополнительной справки вы можетеперейдите по этой ссылке: Xpath против Css селектора

0 голосов
/ 18 мая 2018

Существует несколько фактов, которые необходимо учитывать следующим образом:

  • 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']")
    
  • Оптимизируйте свой код для вызова click(), как только элемент будет возвращен через WebDriverWait следующим образом:

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