首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QAF:在QAF中实现自我修复(Healenium)

QAF:在QAF中实现自我修复(Healenium)
EN

Stack Overflow用户
提问于 2021-02-18 18:42:28
回答 1查看 381关注 0票数 1

我是QAF的新手,我需要使用healenium在我们的测试方法中实现自我修复。我在没有QAF的情况下实现了它,它工作得很好。请参考下面的代码。

代码语言:javascript
复制
import com.epam.healenium.SelfHealingDriver;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.util.concurrent.TimeUnit;

public class BaseTest {
    static protected SelfHealingDriver driver;

    @BeforeAll
    static public void setUp() {
        WebDriverManager.chromedriver().setup();
        ChromeOptions options = new ChromeOptions();
        options.setHeadless(false);
        //declare delegate
        WebDriver delegate = new ChromeDriver(options);
        driver = SelfHealingDriver.create(delegate);
        driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS);
        driver.manage().window().setSize(new Dimension(1200, 800));
    }

    @AfterAll
    static public void afterAll() {
        if (driver != null) {
            driver.quit();
        }
    }
}

我只想把这个自我修复的驱动程序和上面的QAF web驱动程序打包在一起。

EN

回答 1

Stack Overflow用户

发布于 2021-02-19 06:45:29

QAF不鼓励对驱动程序使用静态类变量。所提供的代码将不适用于并行执行。驱动程序管理由qaf负责,具有线程安全和不同的行为,可以使用property selenium.singletone进行设置。

当您需要SelfHealingDriver时,可以尝试使用以下方法:

代码语言:javascript
复制
public class SampleTest extends WebDriverTestCase {

   @Test
   public void yourTestCase(){
      SelfHealingDriver driver = SelfHealingDriver.create(getDriver());
      //your code goes below
   }
}

SelfHealingDriver代理实际的驱动程序。您可以使用findelement/findChildelement的侦听器在没有驱动程序代理的情况下实现自我修复功能。Driver listener应该可以在没有代理驱动的情况下工作。例如:

代码语言:javascript
复制
public class WDListener extends QAFWebDriverCommandAdapter {

private static final Map<String, Object> byToString = JSONUtil.toMap(
            "{'ByCssSelector':'css selector','ByClassName':'class name','ByXPath':'xpath','ByPartialLinkText':'partial link text','ById':'id','ByLinkText':'link text','ByName':'name'}");

   //this method will called when new driver object created
   public void onInitialize(QAFExtendedWebDriver driver){
        driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS);
        driver.manage().window().setSize(new Dimension(1200, 800));
   }

    @Override
    public void afterCommand(QAFExtendedWebDriver driver, CommandTracker commandTracker) {
        if (DriverCommand.FIND_ELEMENT.equalsIgnoreCase(commandTracker.getCommand())
                || DriverCommand.FIND_ELEMENTS.equalsIgnoreCase(commandTracker.getCommand())
                || DriverCommand.FIND_CHILD_ELEMENT.equalsIgnoreCase(commandTracker.getCommand())
                || DriverCommand.FIND_CHILD_ELEMENTS.equalsIgnoreCase(commandTracker.getCommand())) {
            Map<String, Object> parameters = commandTracker.getParameters();
            if (parameters != null && parameters.containsKey("using") && parameters.containsKey("value")) {
                By by = LocatorUtil
                        .getBy(String.format("%s=%s", parameters.get("using"), parameters.get("value")));
                
                HealingServiceImpl healingServiceImpl = new HealingServiceImpl(new SelfHealingEngine(driver));
                StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
                Object result = commandTracker.getResponce().getValue();
                List<WebElement> webElements = List.class.isAssignableFrom(result.getClass())?(List<WebElement>) result:Collections.singletonList((WebElement)result)
                healingServiceImpl.savePath(new PageAwareBy(driver.getTitle(),by),webElements);
            }

        }
    }

    @Override
    public void onFailure(QAFExtendedWebDriver driver, CommandTracker commandTracker) {
        // StackTraceElement[] stackTrace =
        // commandTracker.getException().getStackTrace();

        Map<String, Object> parameters = commandTracker.getParameters();
        if (parameters != null && parameters.containsKey("using") && parameters.containsKey("value")) {
            By by = LocatorUtil
                    .getBy(String.format("%s=%s", parameters.get("using"), parameters.get("value")));
            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
            HealingServiceImpl healingServiceImpl = new HealingServiceImpl(new SelfHealingEngine(driver));

            Optional<By> healedBy = healingServiceImpl.healLocators(new PageAwareBy(driver.getTitle(),by), null, stackTrace) ;
            if(healedBy.isPresent()) {
            commandTracker.getParameters().putAll(toParams(healedBy.get()));
            commandTracker.setRetry(true);
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66258311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档