Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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/Selenium—单击页面上的第一个按钮可以在50%的时间内工作_Java_Selenium_Selenium Webdriver - Fatal编程技术网

JAVA/Selenium—单击页面上的第一个按钮可以在50%的时间内工作

JAVA/Selenium—单击页面上的第一个按钮可以在50%的时间内工作,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我正在使用Selenium自动化web应用程序的一些UI单击。其中一个页面我有几个按钮,指向一些细节。它们都有相同的名字,但我可以点击其中一个,所以我只点击第一个。但是有时有效,有时无效 WebElement DetailsButton = setPresentElementByXpath("//input[1][@type='button' and @value='Go to Details']"); DetailsButton.click(); 我正在使用setPresentElement

我正在使用Selenium自动化web应用程序的一些UI单击。其中一个页面我有几个按钮,指向一些细节。它们都有相同的名字,但我可以点击其中一个,所以我只点击第一个。但是有时有效,有时无效

WebElement DetailsButton = setPresentElementByXpath("//input[1][@type='button' and @value='Go to Details']");
DetailsButton.click();
我正在使用setPresentElementByXpath动态地等待元素

private WebElement setPresentElementByXpath(String xpath) throws Exception {
    WebElement myDynamicElement = (new WebDriverWait(driver, 15))
          .until(ExpectedConditions.presenceOfElementLocated(By.xpath(xpath)));
    return myDynamicElement;
    }
我做错了什么


编辑:我忘了提到它失败的地方。它通过
DetailsButton.click()没有问题,但单击下一步失败,屏幕截图和日志显示,在单击按钮后应该显示的页面不在那里,因此我假设按钮没有单击。

页面加载速度变化和缓存可能是问题所在。如果发生元素“未找到”异常,请使用,使其可通过(通过)单击

如果出现“另一个元素将收到单击”的异常,您可以直接使用。注意:JS操作没有返回值(无论是否有效),并且不会像Selenium.click()那样等待页面加载(如果在单击之后发生)


您是否尝试过使用
ExpectedConditions.visibilityOfElement(WebElement)
而不是presence?它可能试图在按钮在页面上可见但在DOM中出现之前单击该按钮。还有,为什么要使用XPath?XPath是非常脆弱的,我敢肯定它不能帮助解决这些问题。如果可能的话,使用CSS选择器。元素的可见性也是如此。通常我使用ID,但如果我不能,我会尽我所能使用。通常是xpath,习惯的力量。尝试使用其他方式单击,如使用actions类或JavaScript Executor。您得到的异常是什么?我在应该单击的下一个元素上得到超时异常。这不是同步问题,因为我在这两个元素之间添加了一些固定的等待来检查,错误仍然发生。正如我提到的,元素被找到并且可见,Selenium认为它被单击了,因为它不会抛出任何错误。我得到了下一个元素的超时时间,因为它从未真正加载过。
WebElement myDynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.elementToBeClickable(By.id("myDynamicElement")));
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click()", element);