如何在弹出窗口中单击带有Selenium的按钮?尝试了各种方法都没有成功



我正在使用Selenium和Java来自动化我在工作中执行的过程。它通过电脑供应商网站并提交保修申请。我在点击";关闭";弹出框中的按钮。提示并不总是出现,它是用javascript生成的。事实上,我是用Python写的,但我是一名大学生,我的学位课程使用java,所以我想把它转换过来。我也在使用谷歌浏览器和Chromedriver。

非常感谢您的帮助,我很乐意尝试更多的东西。在下面的一切之后,我的下一步是将鼠标移动到按钮上,但我还没有研究过。

更新:我的checkIfExistsByXpath方法不正确,我需要2秒的Thread.Sleep((。该方法应该是:

public boolean checkIfExistsByXpath(WebDriver driver, String xpath){
try {
driver.findElement(By.xpath(xpath));
} catch (org.openqa.selenium.NoSuchElementException e){
e.printStackTrace();
return false;
} return true;

不是我下面的。

我尝试过的:

按钮没有ID。我试图通过等待的xpath获取值,这给了我一个NoSuchElement异常,并说它不是正确的xpath。我已经三次检查了xpath,它是直接从源复制的,我使用我制作的checkIfExistsByXpath方法获得了相同的异常:

WebElement okButton = new WebDriverWait(driver, 30).until(
ExpectedConditions.elementToBeClickable(By.xpath("//*[@id="modalDuplicateDispatch"]/div/div/div[3]/button")));
okButton.click();

我试着让线程进入睡眠状态(这在Python中有效(,我也试着等待(5000(:

Thread.sleep(5000);
WebElement okButton = new WebDriverWait(driver, 30).until(
ExpectedConditions.elementToBeClickable(By.xpath("//*[@id="modalDuplicateDispatch"]/div/div/div[3]/button")));
okButton.click();

我试图从类中获取所有元素,并在循环中单击它们,这给了我一个elementClickIntercepted异常,我也在模态类中尝试过:

List<WebElement> buttonElements = driver.findElements(By.className("btn btn-primary"));
for (WebElement buttonElement : buttonElements) {
buttonElement.click();
}

我试着检查它是否是一个警报框,它跳过了这个,所以我不认为它是警报框:

if (isAlertPresent)(driver){
driver.switchTo().alert().accept();
}
if (isAlertPresent)(driver){
driver.switchTo().alert().dismiss();
}

我试着使用Javascript Executor,我记不起确切的代码了,但它也不起作用。

检查弹出窗口是否存在的功能

public boolean isAlertPresent(WebDriver driver){
try {
driver.switchTo().alert();
return true;
}   // try
catch (NoAlertPresentException Ex) {
return false;
}   // catch
}   // isAlertPresent()
public boolean checkIfExistsByXpath(WebDriver driver, String xpath){
try {
driver.findElement(By.xpath(xpath));
return true;
} catch (NoSuchElementException e){
e.printStackTrace();
} return false;
}

来自网页的HTML类

<div class="modal" id="commonNotificationModal" style="display: none;">
<div class="modal-dialog fadeDown in" role="dialog" aria-hidden="true">
<div class="modal-content">
<div class="modal-header">
<button data-dismiss="modal" aria-label="Close" class="close" type="button">
<clr-icon aria-hidden="true" shape="close"></clr-icon>
</button>
<h3 class="modal-title"></h3>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">OK</button>
</div>
</div>
</div>
</div>

尝试一个更简单的xpath-它是通用的,有望获得成功:

By.xpath("//button[text()='OK']")

我知道你说你从python(python工作的地方(复制了你的一个,但它看起来不太对劲。Selenium告诉你它没有找到,所以尝试不同的东西不会有什么坏处。如果你得到了很多与xapth匹配的点击——试试findelements,看看是否有其他点击是你想要的——然后从那里开始减少标识符的通用性。

我可能还差得很远,但我有一种感觉,那就是模式DuplicateDispatch中的双引号和转义符。即该位:(By.xpath("//*[@id="modalDuplicateDispatch"]/

(我在你的网页源中也没有看到modalDuplicateDispatch,所以我假设它高出一个级别?(

我通常在xpath文本周围使用单引号。我快速环顾四周:

java标识符示例-java对xpath字符串使用">

python标识符示例-python使用"对于xpath字符串

值得一试吗?

driver.switch_to.alert.accept()driver.switch_to.alert.dismiss()

当弹出窗口出现在父窗口上方时,您应该在selenium中进行窗口处理。

试试这个方法:

Driver.SwitchTo().frame("Fancybox-frame");
Driver.findElement("enter your xpath to close popup").click();
Driver.SwitchTo().defaultContent();

如果弹出窗口而不是强迫您单击关闭按钮,请尝试单击空白

actions.moveByOffset(200400(.click((.perform((;

相关内容

  • 没有找到相关文章

最新更新