获取子项';使用Selenium-Java创建XPath

获取子项';使用Selenium-Java创建XPath,java,selenium,xpath,subitem,Java,Selenium,Xpath,Subitem,在第三步中,我尝试单击菜单中的子项时遇到问题 我不需要登录 立项 仅删除已创建的卡 我认为问题在于如何获得正确的xpath 页面 包页面对象 导入org.openqa.selenium.By; 导入org.openqa.selenium.Keys; 导入org.openqa.selenium.WebDriver; 导入org.openqa.selenium.WebElement; 导入org.openqa.selenium.interactions.Actions 公共类页面{ 受保护的最终We

在第三步中,我尝试单击菜单中的子项时遇到问题

  • 我不需要登录

  • 立项

  • 仅删除已创建的卡 我认为问题在于如何获得正确的xpath 页面

    包页面对象
    导入org.openqa.selenium.By; 导入org.openqa.selenium.Keys; 导入org.openqa.selenium.WebDriver; 导入org.openqa.selenium.WebElement; 导入org.openqa.selenium.interactions.Actions
    公共类页面{ 受保护的最终WebDriver WebDriver

    public Page( final WebDriver driver ) {
        this.webDriver =driver;
    }
    
    protected WebElement element(By by ) {
        return webDriver.findElement( by );
    }
    
    public void pressEnter(){
        Actions builder = new Actions(webDriver);
        builder.sendKeys(Keys.RETURN).perform();
    }
    
    }

  • 页面对象:卡片页面

    package Helpers;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.interactions.Actions;
    public class public class CardPage extends PageObject.Page{
    
        By close = By.xpath("//*[@id='ngdialog5']/div[2]/div/div[2]");
        By menuCard = By.xpath("html/body/div[1]/div/div/div/div/ui-view/project/div[1]/board/div/div/div/backlog-list/div[2]/div/ul/li/ul/div[1]/card/li/div/div[1]/a[3]");
        By container1stCard = By.xpath("html/body/div[1]/div/div/div/div/ui-view/project/div[1]/board/div/div/div/backlog-list/div[2]/div/ul/li/ul/div/card/li/div");
        By delete3 = By.xpath("//*[contains(text(), 'delete')]");
    
        By accceptWarning = By.xpath("html/body/div[4]/div/div[10]/button[1]");
        By openCard = By.xpath("//*[@id=\"scrollable\"]/div/backlog-list/div[2]/div/ul/li/ul/div/card/li/div");
    
        private Services services;
        public CardPage(WebDriver driver) {
            super(driver);
        }
        //SERVICES CARDS
        private void closeCard() {
            element(close).click();
        }
        public void delete1stCard(){
            WebElement Wcontainer1stCard = element(container1stCard);//Menu
            Actions builder = new Actions(super.webDriver);
            Actions hoverOverContainer = builder.moveToElement(Wcontainer1stCard);
            hoverOverContainer.perform();
            Services.waitMilisegundos(1000);
            element(menuCard).click();
    
            Services.waitMilisegundos(500);
            WebElement deleteBtn = element(delete3);
            deleteBtn.click();//Menu Item
            Services.waitMilisegundos(1000);
        }
        public void openCard(){
            element(openCard).click();
        }
    }
    
    页面对象的服务

    package Helpers;
    
    import PageObject.*;
    import org.apache.commons.io.FileUtils;
    import org.openqa.selenium.*;
    import org.openqa.selenium.interactions.Actions;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Date;
    
    public class Services {
        WebDriver webDriver;
        private LandingPage landingPage;
        private MainPage mainPage;
        private LoginPage loginPage;
        private ProjectPage projectPage;
        private CardPage cardPage;
        String url;
        ////
        public Services(TmpEnvironment environment) {
            webDriver = new StartDriver( environment.url ).getWebDriver();
        }
        public Services() {
            webDriver = new StartDriver(TmpEnvironment.STAGING).getWebDriver();
        }
    
        ///LOGIN SERVICES
        public Services login(String email, String passw){
            getLandingPage().goToLoginPage();
            getLoginPage().writeUserName(email)
                    .writePassword(passw)
                    .clickOnLogin();
            return this;
        }
        public Services enterToProject() {
            getMainPage().enterToProject();
            return this;
        }
        //PAGES GETTERS
        public WebDriver getWebDriver() {
            return webDriver;
        }
        public MainPage getMainPage() {
            if (mainPage == null)
                mainPage = new MainPage(webDriver);
            return mainPage;
        }
        public LoginPage getLoginPage() {
            if (loginPage == null)
                loginPage = new LoginPage(webDriver);
            return loginPage;
        }
        public ProjectPage getProjectPage(){
            if (projectPage == null)
                projectPage = new  ProjectPage(webDriver);
            return projectPage;
        }
        public LandingPage getLandingPage() {
            if (landingPage == null)
                landingPage =  new LandingPage(webDriver);
            return landingPage;
        }
        public CardPage getCardPage() {
            if (cardPage == null)
                cardPage = new CardPage(webDriver);
            return cardPage;
        }
        //CARDS SERVICES
        public Services delete1stCard() {
            getCardPage().delete1stCard();
            return this;
        }
        public static void waitMilisegundos(){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        public void pressEnter(){
            Actions builder = new Actions(webDriver);
            builder.sendKeys(Keys.RETURN).perform();
        }
        public void pressEsc(){
            Actions builder = new Actions(webDriver);
            builder.sendKeys(Keys.ESCAPE).perform();
        }
        //
        public Services goToLoginPage() {
            getLandingPage().goToLoginPage();
            return this;
        }
    
        public enum TmpEnvironment {
            DEVELOPMENT( "http://tmp-landing-dev.theamalgama.com/index" ),
            STAGING( "https://tmpapp.theamalgama.com" ),
            PRODUCTION( "https://tmpapp.com" );
            public final String url;
            TmpEnvironment( final String url ) {
                this.url = url;
            }
            public String getUrl(){
                return url;
            }
        }
    }
    
    测试班

    package z_Test;
    
    import Helpers.Services;
    import org.junit.After;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    import static Helpers.Services.waitMilisegundos;
    
    public class CardTest {
        static String email, password;
        Services services;
    
        public CardTest(){
            services = new Services();
        }
        @BeforeClass
        public static void setData(){
            email = "test01@testing.com";
            password = "password";
    
        }
        @After
        public void CloseDriver(){
            services.getWebDriver().close();
        }
    
    
        /////////////////////////////////////////////////////////////
        @Test
        public void cardTest(){ 
            services.login(email,password);
            services.enterToProject()
            .delete1stCard();
            waitMilisegundos();
        }
    }
    
    下一步是尝试删除卡时的错误消息

    [org.openqa.selenium.element不可见异常:元素不可见
    (会话信息:chrome=58.0.3029.110)(驾驶员信息: 色度驱动器=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57),平台=Linux 4.4.0-79-generic x86_64)(警告:服务器未提供任何stacktrace信息)命令持续时间或超时:96毫秒 生成信息:版本:“未知”,版本:“未知”,时间:“未知” 系统信息:主机:'julieta',ip:'127.0.1.1',os.name:'Linux', os.arch:'amd64',os.version:'4.4.0-79-generic',java.version: “1.8.0_131”驱动程序信息:org.openqa.selenium.chrome.ChromeDriver 功能[{applicationCacheEnabled=false,rotatable=false, mobileEmulationEnabled=false,networkConnectionEnabled=false, chrome={chromedriverVersion=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57), userDataDir=/tmp/.org.chromium.chromium.rQuYOu}, takesHeapSnapshot=true,pageLoadStrategy=normal, databaseEnabled=false,handlesAlerts=true,hasTouchScreen=false, version=58.0.3029.110,platform=LINUX,browserConnectionEnabled=false, nativeEvents=true,acceptSslCerts=true,locationContextEnabled=true, WebStorage Enabled=true,browserName=chrome,takesScreenshot=true, javascriptEnabled=true,CSSSelectorEnabled=true, unexpectedAlertBehaviour=}]会话ID: a33c710a9bae046f731a66bb56b344b8 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.openqa.selenium.remote.ErrorHandler.CreateTrowable(ErrorHandler.java:215) 在 org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:167) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:671) 在 org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:272) 在 org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:82) 在PageObject.CardPage.delete1stCard(CardPage.java:92)处 Helpers.Services.delete1stCard(Services.java:201)位于 CardTest.CardTest.CardTest(CardTest.java:69)位于 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于 invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.lang.reflect.Method.invoke(Method.java:498) org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:50) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:47) 在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 在 org.junit.internal.runners.statements.runafter.evaluate(runafter.java:27) 位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)位于 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)位于 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)位于 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)位于 org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 位于org.junit.runners.ParentRunner.run(ParentRunner.java:363) org.junit.runner.JUnitCore.run(JUnitCore.java:137)位于 JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 在 intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) 在 com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 在 com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

    ]


    我还尝试使用不同的xpath,所以运行它时会得到另一种验证:
    org.openqa.selenium.NoSuchElementException:无法定位元素:

    我认为您有许多问题需要改进

  • 你使用的是绝对的XPath,这是一个糟糕的做法。它们非常脆弱。你应该花些时间阅读一些手工制作XPath的教程。它们会更短,更容易阅读,但也不会那么脆弱

  • 不要使用方法
    delete1stCard()
    ,而是创建一个方法
    deleteCard(int index)
    ,该方法采用索引,以便您可以删除所需的任何卡。您可能需要另一种方法
    deleteCard(String cardName)
    ,该方法接收卡名并将其删除。我认为这可能比按索引删除更有用,但我不知道您的测试用例是什么样子。(或者更好的是,实现一个卡组件类,如我
    public class CardComponent
    {
        private WebDriver driver;
        private WebElement card;
        private By deleteCardLocator = By.xpath(".//p[@class='option-list-option'][.='Delete']");
        private By acceptDeleteButtonLocator = By.xpath("//button[.='Accept']");
    
        public CardComponent(WebDriver webDriver, String cardName)
        {
            driver = webDriver;
            card = new WebDriverWait(webDriver, 10)
                    .until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//card[contains(., '" + cardName + "')]")));
        }
    
        public void delete()
        {
            openMenu();
            card.findElement(deleteCardLocator).click();
            driver.findElement(acceptDeleteButtonLocator).click();
        }
    
        private void openMenu()
        {
            new Actions(driver).moveToElement(card).perform();
            card.findElement(By.id("dots")).click();
        }
    }
    
    CardComponent card = new CardComponent(driver, "card to delete");
    card.delete();