我有以下代码在拍卖网站上设置自动出价。
我已经卡住,因为确认按钮被禁用,直到用户在文本字段中键入按键。
我可以使用selenium.type
填充该字段,但这不会从按钮中删除已禁用的属性。
我希望在.type
命令完成后可能有一种删除属性的方法。
我搜索了许多页面以找到答案,我发现它可能是可能的,但对于我的生活,我无法让它发挥作用。
有人可以帮助解决我在这里做错的事情:
import static org.junit.Assert.*;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
import static org.hamcrest.Matchers.containsString;
public class Bidder_Home_004 {
private Selenium selenium;
@Before
public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*chrome", "URL");
selenium.start();
}
@Test
public void testBidder_Home_004() throws Exception {
// Login
selenium.open("/bidderlogin");
selenium.select("id=ContentPlaceHolder1_ddlBidder", "label=A H Biler");
selenium.click("id=ContentPlaceHolder1_btnLogin");
selenium.waitForPageToLoad("30000");
selenium.click("id=hrefCurrent");
selenium.waitForPageToLoad("30000");
Thread.sleep(3000);
// End Login
// Navigate to Home page
selenium.click("//*[@id='hrefCurrent']");
selenium.waitForPageToLoad("30000");
// End Navigate to Home page
// Find Active Tab
String linkHome = selenium.getText("//li[@class='active']");
assertEquals("Igangværende", linkHome);
// End Find Active Tab
// Get Auction ID
selenium.click("//*[@id='spanWait']");
Thread.sleep(3000);
String linkAuctionlist = selenium.getValue("//*[starts-with(@id, 'liAuction')]/@id");
linkAuctionlist = linkAuctionlist.replace("liAuction", "");
// End Get Auction ID
// Get Vehicle ID
String carsinAuction = selenium.getValue("//*[1][contains(@id,'btnBidUp')]/@id");
carsinAuction = carsinAuction.replace("btnBidUp","");
// End Get Vehicle ID
//Find Original Vehicle Value
String OrgVal1 = selenium.getText("//*[@id='bidvalue_"+carsinAuction+"']");
OrgVal1 = OrgVal1.replace("kr. ", "");
OrgVal1 = OrgVal1.replace(".", "");
int OrgVal2 = Integer.parseInt(OrgVal1);
int nextBid = (OrgVal2 + 1500);
// End Find Original Vehicle Value
// Click AutoBid button
selenium.click("//*[@id='btnProxy"+carsinAuction+"']");
Thread.sleep(2000);
selenium.type("//*[@id='txtProxyBid']", ""+nextBid+"");
((JavascriptExecutor)selenium).executeScript("arguments[0].removeAttribute('disabled','disabled')");
selenium.click("//*[@id='btnSubmit']");
Thread.sleep(2000);
// End Click AutoBid button
// Find New Vehicle Value
String NewVal1 = selenium.getText("//*[@id='bidvalue_"+carsinAuction+"']");
NewVal1 = NewVal1.replace("kr. ", "");
NewVal1 = NewVal1.replace(".", "");
int NewVal2 = Integer.parseInt(NewVal1);
// End Find New Vehicle Value
String fileName = new SimpleDateFormat("ddMMyyyy'Autobid.txt'").format(new Date());
PrintWriter writer = new PrintWriter(fileName, "UTF-8");
writer.println(NewVal2);
writer.close();
}
@After
public void tearDown() throws Exception {
selenium.stop();
}
}
正如您在“ Click Autobid Button ”部分中所看到的,我有一行包含JavascriptExecutor
- 这是我在其他论坛和stackoverflow中找到的一行但是我尚未开始工作。
当我执行时,我有 跟随错误 :
java.lang.ClassCastException:com.thoughtworks.selenium.DefaultSelenium无法强制转换为org.openqa.selenium.JavascriptExecutor
如何解决此错误问题?
答案 0 :(得分:0)
对于Selenium Webdriver:
请从导入部分的代码中删除以下行:
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
导致一些冲突
答案 1 :(得分:0)
原因在于您的包装类DefaultSelenium
。
要转换为JavascriptExecutor
,它应该是selenium Driver
实例的独特实例。
它看起来如下:
((JavascriptExecutor)DefaultSelenium.getDriverInstance())。executeScript()
要解决转换为JavascriptExecutor
,您应该返回explisit驱动程序实例(Firefox,Chrome,Opera,IE ...驱动程序)。
此方法应具有以下签名:
class DefaultSelenium {
// all class stuff here
public static RemoteWebDriver getDriverInstance() {
return currentDriverInstance;
}
在您拥有正确的Selenium RemoteWebDriver
实例后,您可以将其转换为JavascriptExecutor
并执行 JS脚本 。
<强> 顺便说一句: 强>
使用Thread.sleep()
是非常糟糕的风格。
更好的方法是使用 明确等待 - Explicit and Implicit Waits