如何使用JavascriptExecutor和Selenium WD删除元素属性?
我有下面的代码在拍卖网站上设置自动竞价。 我被卡住了,因为确认按钮被禁用,直到用户在文本字段中键入按键。 我可以使用如何使用JavascriptExecutor和Selenium WD删除元素属性?,java,selenium,classcastexception,Java,Selenium,Classcastexception,我有下面的代码在拍卖网站上设置自动竞价。 我被卡住了,因为确认按钮被禁用,直到用户在文本字段中键入按键。 我可以使用selenium.type填充字段,但是这不会从按钮中删除禁用属性 我希望有一种方法可以在.type命令完成后删除该属性 我已经搜索了很多页来寻找答案,我发现这可能是可能的,但就我的一生而言,我无法让它发挥作用 有人能帮我解决一下我做错了什么吗: import static org.junit.Assert.*; import java.io.PrintWriter; import
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();
}
}
正如您在“单击自动ID按钮”一节中所看到的,我有一行包含了JavascriptExecutor
——这是我在其他论坛和stackoverflow中找到的一行,但是我还没有让它工作
当我执行时,我有以下错误:
java.lang.ClassCastException:com.thoughtworks.selenium.DefaultSelenium不能强制转换为org.openqa.selenium.JavascriptExecutor
如何解决此错误问题?对于Selenium Webdriver:
请从“导入”部分的代码中删除以下行:
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
它会导致一些冲突原因在于您的包装类
DefaultSelenium
要转换为JavascriptExecutor
,它应该是selenium的驱动程序的不同实例
它应该如下所示:
((JavascriptExecutor)DefaultSelenium.getDriverInstance()).executeScript()
要解决转换到JavascriptExecutor
的问题,您应该返回驱动程序的explisit实例(Firefox、Chrome、Opera、IE…驱动程序)
此方法应具有如下签名:
class DefaultSelenium {
// all class stuff here
public static RemoteWebDriver getDriverInstance() {
return currentDriverInstance;
}
在获得正确的SeleniumRemoteWebDriver实例后,您可以将其强制转换为JavascriptExecutor
并执行JS脚本
顺便说一句:
使用Thread.sleep()
是非常糟糕的风格
更好的方法是使用显式等待-如果删除导入,代码将无法编译。OP正在混合selenium 1和webdriver,所以他需要修复它。没有这些导入,正确的代码无法编译,仍然不确定我在哪里混合了版本,尽管您混合了selenium 1和2(webdriver)版本。决定你要使用哪一个(大多数人会更喜欢Webdriver)。对不起,我的in=gnorance,但你能强调一下我在哪里混合了这些吗?我是自动化新手,认为一切都很好,除了删除“禁用”之外,所有代码都正常工作part@TonyII你的问题解决了吗,现在?嗨@nazar_art no,我的问题还没有解决,我已经意识到我可能混合了两个版本,虽然我不确定如何混合,但我只能认为从录制中导出代码,然后手动编辑可能是我的错误。我目前正在着手从零开始脚本,不需要录音,看看是否可以让它工作。如果有更多的帮助,我们将不胜感激