如何使用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;
   }
在获得正确的Selenium
RemoteWebDriver实例后,您可以将其强制转换为
JavascriptExecutor
并执行JS脚本

顺便说一句:

使用
Thread.sleep()
是非常糟糕的风格


更好的方法是使用显式等待-

如果删除导入,代码将无法编译。OP正在混合selenium 1和webdriver,所以他需要修复它。没有这些导入,正确的代码无法编译,仍然不确定我在哪里混合了版本,尽管您混合了selenium 1和2(webdriver)版本。决定你要使用哪一个(大多数人会更喜欢Webdriver)。对不起,我的in=gnorance,但你能强调一下我在哪里混合了这些吗?我是自动化新手,认为一切都很好,除了删除“禁用”之外,所有代码都正常工作part@TonyII你的问题解决了吗,现在?嗨@nazar_art no,我的问题还没有解决,我已经意识到我可能混合了两个版本,虽然我不确定如何混合,但我只能认为从录制中导出代码,然后手动编辑可能是我的错误。我目前正在着手从零开始脚本,不需要录音,看看是否可以让它工作。如果有更多的帮助,我们将不胜感激