【问题标题】:How do I click on an image button in WebDriver using Java?如何使用 Java 在 WebDriver 中单击图像按钮?
【发布时间】:2013-04-01 13:39:53
【问题描述】:

按钮类型为图片,并附上HTML代码中的相关代码。我已经输入了所有数据并点击了立即申请按钮,它根本没有保存。但是当我尝试手动创建它时,它会在不到 15 秒内保存。

请找到随附的屏幕截图。

相关代码:

//Navigating to Quick Application
driver.get(QAurl);
Thread.sleep(15000);
driver.findElement(By.id("DdlSalesPerson")).sendKeys("Swamy m Kumara");
driver.findElement(By.id("TxtFName")).sendKeys("Kumar");
driver.findElement(By.id("TxtLName")).sendKeys("Swamy");
driver.findElement(By.id("TxtAddress")).sendKeys("434, Main Road, Somajiguda");
driver.findElement(By.id("TxtZip")).sendKeys("79081");
driver.findElement(By.id("TxtSSN1")).sendKeys("881");
Thread.sleep(15000);
driver.findElement(By.id("TxtSSN2")).sendKeys("72");
driver.findElement(By.id("TxtSSN3")).sendKeys("4365");
Thread.sleep(5000);
driver.findElement(By.id("TxtDayPhone1")).sendKeys("963");
driver.findElement(By.id("TxtDayPhone2")).sendKeys("210");
driver.findElement(By.id("TxtDayPhone3")).sendKeys("5478");
Thread.sleep(5000);
driver.findElement(By.id("ChkIAgree")).click();
driver.findElement(By.id("TxtSignature")).sendKeys("Kumar Swamy");
Thread.sleep(5000);
System.out.println("Entered all the required fields");
//Reading the value in the image.
WebElement element = driver.findElement(By.id(OR.getProperty("FP_SImg_ID")));
String src = ((JavascriptExecutor)driver).executeScript("return arguments[0].attributes['src'].value;", element).toString();
img =src.split("=");
System.out.println("Value retrieved from the Image source: "+img[1]);
driver.findElement(By.id(OR.getProperty("FP_TxtSImg_ID"))).sendKeys(img[1]);
Thread.sleep(5000);
driver.findElement(By.id("TxtEmailId")).sendKeys("abc@abc.com");
driver.findElement(By.name("BtnSubmit")).click();
Thread.sleep(35000);
System.out.println("Successfully Applied from the QuickApp");

立即应用按钮的 HTML 代码:

<input id="BtnSubmit" type="image" style="height:33px;width:121px;border-width:0px;" 
onclick="javascript:return validateControls();" src="../Common/Images/HybridQA  
/apply_now.png" title="Submit Here" tabindex="45" name="BtnSubmit">

任何帮助将不胜感激。

【问题讨论】:

  • 您如何衡量保存时间?在您单击按钮并且 selenium 得到响应后,您的代码会在此处再停留 35 秒,然后它才能再次执行任何操作。是什么让您如此确定 Thread.sleep() 不会导致额外的等待时间?
  • 我已经给了一些时间来等待保存/提交申请。它没有在给定的时间内保存/提交。我无法保存它,因为按钮类型是图像,您可以在附加的 HTML 代码中看到它。

标签: java javascript webdriver selenium-webdriver


【解决方案1】:

您的代码中有 1 分 25 秒的 Thread.sleep()...

删除所有的thread.sleep(),如果你正在等待元素正确出现,请使用显式等待:

http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

以上面链接的页面为例:

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

查看 ExpectedConditions 类,了解 selenium 中内置的可用条件,如果它们不满足您的需求,编写您自己的预期条件很简单。

-------------------编辑-------强>

为了记录,这个答案是针对下面引用的原始问题(您也可以查看原始问题的编辑历史来验证这一点)。

在 Java 中使用 Webdriver 单击“立即应用”按钮后需要很长时间才能保存

点击立即应用按钮后需要很长时间保存 Java 中的 Web 驱动程序。我已输入所有数据并单击应用 现在按钮,它根本没有保存。但是当我尝试创建它时 手动保存,不到 15 秒。请找到 附上屏幕截图。

【讨论】:

  • 感谢您的回复,但问题不在于 Thread.sleep() 方法。在这里,我问了这个问题。单击立即应用按钮后,它不会保存详细信息并提交报告。我已经使用等待将脚本与应用程序同步。
  • 我在您编辑之前回答了您的原始问题。你的新问题完全不同。在单击之前使用显式等待以确保图像在那里仍然是您应该做的事情。
【解决方案2】:

这个问题可能有两个原因。

  1. 一个来自“立即应用”按钮的 HTML 代码,我可以看到它显示为“输入 id='BtnSubmit'",但在你的脚本中它写成 'driver.findElement(By.name("BtnSubmit")).click();'。 不应该是"driver.findElement(By.id("BtnSubmit")).click()"吗? “名称”必须是 替换为“id”。

  2. 在脚本结束时单击“BtnSubmit”,会话可能会立即过期 你点击那个按钮。当您使用旧版本和新版本时,通常会出现此问题 selenium 独立 jar 文件。确保您只使用最新版本而不是 除了旧版本。

【讨论】:

  • 感谢您的回复。关于你的第一点。它可以是任何东西'driver.findElement(By.name("BtnSubmit")).click();'或'driver.findElement(By.id("BtnSubmit")).click();'。因为 ID 和 Name 属性的属性值相同。请查看相关的 HTML 代码。
  • 关于第二点,我只使用 1 个版本的 Selenium Standalone jar 文件版本 2.21.0。当我发现最新版本的 selenium 独立 jar 文件存在一些问题时。
  • 要检查它是因为“立即应用”按钮还是会话,请尝试在脚本中编写一些额外的行并检查问题是否仍然存在。如果是因为会话,请尝试使用安静稳定的 selenium-server-standalone-2.28.0。
  • 我在 selenium 下载中找不到任何 2.28.0 版本
【解决方案3】:

使用这个,

driver.findElement(By.id("TxtEmailId")).sendKeys(Keys.ENTER);

之后,

driver.findElement(By.id("TxtEmailId")).sendKeys("abc@abc.com");

和评论,

driver.findElement(By.name("BtnSubmit")).click();

所以你的代码看起来像,

driver.findElement(By.id("TxtEmailId")).sendKeys("abc@abc.com");
driver.findElement(By.id("TxtEmailId")).sendKeys(Keys.ENTER);
//driver.findElement(By.name("BtnSubmit")).click();

有时很难处理图像按钮,因为当输入所有必填字段时,这些按钮就会被激活。确保您填写了所有必填字段,并在输入表格中的最后一个字段后按 Enter。首先尝试手动进行。而不是点击按钮在最后一个输入字段按回车,并使用与自动化相同的策略。

更新:

使用您自己的代码并将 Thread.sleep() 替换为以下方法。

这样称呼,

waitForElementToBePresent(By.id("DdlSalesPerson"), 15000);

无论您作为参数传递什么,它都会等待下一个元素。如果找到则返回 true,否则返回 false。如果在给定时间内找到元素,它将立即返回 true 而不是等待给定时间。

public boolean waitForElementToBePresent(By by, int waitInMilliSeconds) throws Exception
    {
        WebDriver driver = getDriver();
        int wait = waitInMilliSeconds;
        int iterations  = (wait/250);
        long startmilliSec = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++)
        {
            if((System.currentTimeMillis()-startmilliSec)>wait)
                return false;
            List<WebElement> elements = driver.findElements(by);
            if (elements != null && elements.size() > 0)
                return true;
            Thread.sleep(250);
        }
        return false;
    }

【讨论】:

  • 感谢您的回复。我使用脚本和手动尝试了您的答案。它没有用。这是一个 Onclick=Button Submit 事件。
猜你喜欢
  • 2012-08-23
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 2021-11-09
  • 2016-01-30
  • 1970-01-01
  • 2017-12-26
  • 2020-01-24
相关资源
最近更新 更多