Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找不到链接的定位器_Java_Selenium_Selenium Webdriver_Intellij Idea - Fatal编程技术网

Java 找不到链接的定位器

Java 找不到链接的定位器,java,selenium,selenium-webdriver,intellij-idea,Java,Selenium,Selenium Webdriver,Intellij Idea,这是主要的方法: package Pages; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public c

这是主要的方法:

package Pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class HomePage {
    WebDriver driver;

    public HomePage() {
        System.setProperty ("webdriver.chrome.driver", "D:\\Desktop\\Selenium\\chromedriver.exe");
        this.driver = new ChromeDriver ();
        PageFactory.initElements (driver, this);
    }

    @FindBy(xpath = "//*[@id='MenuContent']/a[2]")
    WebElement signInButton;


    public void signInButtonClick() {
        signInButton.click();

    }
}
我正在尝试为一个特定的链接获取一个定位器(CSS或XPATH或其他任何东西),无论我尝试什么,我都无法管理

这是有问题的链接:

我已尝试为[text()='Sign In']查找定位符

运行main方法后,进程不会执行,以下是错误:

import Pages.HomePage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) {

        System.setProperty ("webdriver.chrome.driver", "D:\\Desktop\\Selenium\\chromedriver.exe");
        WebDriver driver = new ChromeDriver ();
        driver.manage ().timeouts ().implicitlyWait (10, TimeUnit.SECONDS);
        driver.manage ().window ().maximize ();
        driver.get ("https://petstore.octoperf.com/actions/Catalog.action");

        HomePage homePage = new HomePage ();
        homePage.signInButtonClick ();
    }
}
  • 这里很少有不正确的地方。 驱动程序被初始化了2次,这应该是不正确的。 通往壁虎河的道路似乎也不正确
我在下面添加了正确的代码,但是使用了chromedriver而不是geckodriver。它正在使用下面的代码

*** Element info: {Using=xpath, value=//*[@id='MenuContent']/a[2]}
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:78)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:428)
    at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
    at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
    at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
    at jdk.proxy2/jdk.proxy2.$Proxy4.click(Unknown Source)
    at Pages.HomePage.signInButtonClick(HomePage.java:23)
    at Main.main(Main.java:17)
要复制驱动程序位置,只需转到eclipse中的驱动程序文件夹位置,右键单击驱动程序,然后从属性中复制路径。 我在下面添加了截图


有几件事需要纠正

  • 您正在创建两个驱动程序,一个在
    main
    中,一个在
    主页中。您应该从
    main
    创建驱动程序,并通过构造函数将该实例传递到
    HomePage
  • 您发布的第一个XPath无效
    a[text()='Sign-In']
    应该是
    //a[text()='Sign-In']
  • Selenium的创建者表示,
    PageFactory
    和隐式等待是一种不好的做法,不应使用。而是使用页面对象模型和
    WebDriverWait
  • 我重写了你的代码并进行了测试,它成功地点击了登录链接

    Main.java

    package sample;
    
    import java.util.concurrent.TimeUnit;
    
    import org.openqa.selenium.WebDriver;
    
    public class Main {
        public static void main(String[] args)  {
            HomePage homePage = new HomePage();
            WebDriver driver = homePage.driver;
            driver.manage().timeouts().implicitlyWait (10, TimeUnit.SECONDS);
            driver.manage().window().maximize();
            driver.get("https://petstore.octoperf.com/actions/Catalog.action");
        
            homePage.signInButtonClick();
        }
    }
    
    HomePage.java

    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    import Pages.HomePage;
    
    public class Main {
        public static void main(String[] args) {
            System.setProperty("webdriver.chrome.driver", "D:\\Desktop\\Selenium\\chromedriver.exe");
            WebDriver driver = new ChromeDriver();
            driver.manage().window().maximize();
            driver.get("https://petstore.octoperf.com/actions/Catalog.action");
    
            HomePage homePage = new HomePage(driver);
            homePage.signInButtonClick();
        }
    }
    

    我切换到chrome驱动程序,但仍然无法使用您的代码:(您遇到了什么错误?请您也分享一下您的驱动程序路径,因为我认为问题可能就是因为这个。另外,您确定用于selenium和驱动程序的版本彼此兼容吗?我使用的是selenium-3.141.59,chromeDriver是最新版本。同样,我现在正在编辑使用的更新代码请查看:)在您的代码中,在Main类中,您最初创建的是WebDriver的一个实例。现在在创建HomePage对象的最后一行的第二行,您将创建WebDriver的另一个实例,因为您正在使用HomePage实例单击SignIn按钮。如果您还记得petStore url是使用的另一个实例打开的司机。这就是为什么它找不到登录按钮。
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    import Pages.HomePage;
    
    public class Main {
        public static void main(String[] args) {
            System.setProperty("webdriver.chrome.driver", "D:\\Desktop\\Selenium\\chromedriver.exe");
            WebDriver driver = new ChromeDriver();
            driver.manage().window().maximize();
            driver.get("https://petstore.octoperf.com/actions/Catalog.action");
    
            HomePage homePage = new HomePage(driver);
            homePage.signInButtonClick();
        }
    }
    
    package Pages;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    
    public class HomePage {
        WebDriver driver;
    
        private By signInButton = By.xpath("//a[text()='Sign In']");
    
        public HomePage(WebDriver driver) {
            this.driver = driver;
        }
    
        public void signInButtonClick() {
            driver.findElement(signInButton).click();
        }
    }