如何使用JavascriptExecutor和Selenium WD删除元素属性?

时间:2015-10-13 10:27:17

标签: java selenium classcastexception

我有以下代码在拍卖网站上设置自动出价。 我已经卡住,因为确认按钮被禁用,直到用户在文本字段中键入按键。 我可以使用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

如何解决此错误问题?

2 个答案:

答案 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