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次,这应该是不正确的。 通往壁虎河的道路似乎也不正确
*** 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
a[text()='Sign-In']
应该是//a[text()='Sign-In']
PageFactory
和隐式等待是一种不好的做法,不应使用。而是使用页面对象模型和WebDriverWait
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();
}
}