1

我对 Selenium 和自动化还很陌生。我正在尝试为简单的健康声明表单页面进行自动化: https ://forms.office.com/Pages/ResponsePage.aspx?id=bGOiBG0y_0iT-HCYdb06qZZ8CdlEQAhOkRllU1E9dVZUMVk1VTZFWThQV1FQUTFUV0FKNkNOVldMSi4u

要进入我使用 xpath 的文本字段:

driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://forms.office.com/Pages/ResponsePage.aspx?id=bGOiBG0y_0iT-HCYdb06qZZ8CdlEQAhOkRllU1E9dVZUMVk1VTZFWThQV1FQUTFUV0FKNkNOVldMSi4u");
WebElement element = driver.findElement(By.xpath("//*[@id=\"form-container\"]/div/div/div[1]/div/div[1]/div[2]/div[2]/div[1]/div[2]/div[3]/div/div/div/input"));
element.click();
element.sendKeys("Testing");

问题是有时它找不到元素并且程序崩溃。

*** Element info: {Using=xpath, value=//*[@id="form-container"]/div/div/div[1]/div/div[1]/div[2]/div[2]/div[1]/div[2]/div[3]/div/div/div/input}
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    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 automactionproj.MainActivity.hazaratBriyot(MainActivity.java:31)
    at automactionproj.MainActivity.main(MainActivity.java:23)

Process finished with exit code 1

有什么建议么?

4

4 回答 4

0

要在第一个元素中发送带有占位符的字符序列作为Enter your answer,您可以使用以下基于Locator Strategy

driver.findElement(By.xpath("//span[text()='Required']//following::div[1]/div//input[@placeholder='Enter your answer']")).sendKeys("LiorShor");

理想情况下,您需要诱导WebDriverWaitelementToBeClickable()您可以使用以下解决方案:

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[text()='Required']//following::div[1]/div//input[@placeholder='Enter your answer']"))).sendKeys("LiorShor");
于 2020-09-14T20:09:46.330 回答
0

由于该页面有 5 个唯一的输入字段,为了避免 html 代码更改和定位器的稳定性,您可以直接使用以下定位器:

(//input)[1]

其中 1 是第一个输入字段的索引。因此,您可以使用 1-5 的任何值。

于 2020-09-14T12:06:24.953 回答
0

使用绝对 xpath 不是一个好方法。我看不到您的应用程序中的 xpath 与您在代码中使用的 xpath 字符串匹配。尝试使用以下相对 xpath:

WebElement element = driver.findElement(By.xpath("//input[@aria-labelledby='question1-title question1-required question1-questiontype']"));
element.sendKeys("Testing");

即使您可以使用唯一属性使 xpath 更短且唯一可识别,例如 //input[contains(@aria-labelledby,'question1-title')]

在文本框中输入文本之前无需执行单击。

于 2020-09-14T05:43:51.853 回答
0

不要尝试自动化 google 表单 出于多种原因,不建议使用 WebDriver 登录 Gmail 和 Facebook 等网站。除了违反这些网站的使用条款(您有可能关闭帐户)之外,它速度慢且不可靠。

理想的做法是使用电子邮件提供商提供的 API,或者在 Facebook 的情况下使用开发人员工具服务,该服务公开了用于创建测试帐户、朋友等的 API。尽管使用 API 可能看起来有点额外的艰苦工作,但您将在速度、可靠性和稳定性方面得到回报。API 也不太可能更改,而网页和 HTML 定位器经常更改并需要您更新测试框架。

在测试的任何时候使用 WebDriver 登录第三方站点都会增加测试失败的风险,因为它会延长测试时间。一般的经验法则是更长的测试更脆弱和不可靠。

符合 W3C 的 WebDriver 实现还使用 WebDriver 属性注释导航器对象,以便可以缓解拒绝服务攻击。

于 2020-09-14T05:51:53.600 回答