无法单击Selenium Webdriver中的单选按钮

时间:2015-08-31 08:41:56

标签: java selenium

我正在使用Java学习Selenium Webdriver。 作为一个学习示例,我尝试打开MakeMyTrip,访问International Flights page并点击Google Chrome中的 One Way 单选按钮。 我尝试了不同的方法来找到这个单选按钮,但它仍然无法正常工作。 请在下面找到我的代码示例。

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class TryRadioClass {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.setProperty("webdriver.chrome.driver", "Chrome exe path");
        WebDriver driver=new ChromeDriver(); 
        driver.get("http://www.makemytrip.com/international-flights");
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(45, TimeUnit.SECONDS);
        boolean displayFlag = driver.findElement(By.linkText("ONE WAY")).isDisplayed();
        System.out.println("Display Flag :- "+displayFlag);
        boolean enableFlag = driver.findElement(By.linkText("ONE WAY")).isEnabled();
        System.out.println("Enable Flag :- "+enableFlag);
        if(displayFlag==true && enableFlag==true)
        {
            WebElement element=driver.findElement(By.linkText("ONE WAY"));
            element.click();
            System.out.println("Tried to click One Way");
        }
    }

}

有人可以帮我解决这个问题吗?

8 个答案:

答案 0 :(得分:4)

使用以下代码: -

    if(displayFlag==true && enableFlag==true)
    {
        try{
        Thread.sleep(5000);
        }
        catch(Exception ex)
        {
            System.out.println(ex.getMessage());
        }
        WebElement element=driver.findElement(By.xpath("//span[@class='radio_state']"));
        JavascriptExecutor executor = (JavascriptExecutor) driver;
        executor.executeScript("arguments[0].click();", element);
        System.out.println("Tried to click One Way");
    }

享受..如果仍有任何问题,请回复我:)

答案 1 :(得分:1)

点击链接有时可能会跳过检查单选按钮。尝试直接单击单选按钮(或输入html标记),而不是单击锚标记。这是一个例子 -

WebElement ele=driver.findElement(By.xpath("//input[@value='one_way']"));
ele.click();

希望这有帮助。

答案 2 :(得分:0)

根据我的检查,特定单选按钮具有以下结构:

<a id="one_way_button1" href="javascript:void(0);" onclick="change_trip_type('one_way_button', 'trip_type', 'o');" class="one_way_button trip_type row first seg_text" tabindex="1">

    <span class="radio_state">
        <input type="radio" name="way_fields" value="one_way">
    </span> ONE WAY

</a>

所以你要点击的不是标签 a ,其中包含&#39; ONE WAY&#39;但是里面的 span 。您可以尝试使用xpath

来查找范围
"//a[text()='ONE WAY']/span[@class='radio_state']"

答案 3 :(得分:0)

尝试以下xpath。

//*[@id="one_way_button1"]/span/input

它应该有用。

driver.findElement(By.xpath(//*[@id=\"one_way_button1\"]/span/input)).click();

答案 4 :(得分:0)

我们在过去已经发现,通过无线电和点击发生上述情况(有时它点击它有时它没有)并且当我们尝试避开等待任务/ Thread.Sleep时(由于时间的推移)问题然后可能导致不同的环境)。使用thread.sleeps:p

,这一点很快就会成为一个巨大的头痛

我们个人发现有时最好的解决方案是发送一个点击然后发送(Sendkeys.Enter或Sendkeys.Space)或者只发送(Sendkeys.Enter或Sendkeys.Space)并且不要发送用收音机点击。 特别是在使用Telerik控件的页面上。这样就可以在多个机器/环境中工作而无需添加Thread.Sleep并使每个使用该步骤的测试都比需要的时间更长(当你有1000个测试时,相信我5s线程如果很多测试使用相同的方法,很快就会出现.sleep很快就会加起来。)

在混合中投入另一种可能的解决方案......

答案 5 :(得分:0)

  1. 尝试从不使用Thread.sleep(time)
  2. 从不使用常规Exception捕获。
  3. 而不是尝试这个,更安全的是:

    public Boolean isDisplayed() {
        try {
            wait.withTimeout(20).until(new ExpectedCondition<Boolean>() {
                @Nullable @Override public Boolean apply(WebDriver input) {
                  return videoComponent.isDisplayed();
                }
            });
        } catch (TimeoutException e) {
            return false;
        }
        return true;
    }
    

    此代码将在20秒内检查标记,直至 return true
    如果不是,则在20秒后 return false

    始终指定要{strong> Exceptioncatch类型。在其他情况下,它是无用的。

答案 6 :(得分:0)

我尝试了多种方法来强制硒等待单选按钮可见,但是它一直保持超时。我最终不得不解决点击以下标签的问题:

WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement element = driver.findElement(selector);
wait.until(ExpectedConditions.elementToBeClickable(element));
element.click();

其中选择的位置由以下方式定义:

By selector = By.cssSelector(cssSelector);

HTML如下所示:

...
<div class="multi-choice">
    <input id="wibble" type="radio" name="wobble" value="TEXT">
    <label for="wibble">Wobble</label>
</div>
...

还有一个示例字符串cssSelector:

String cssSelector = "label[for='wibble']"

答案 7 :(得分:-1)

这是更合适的方法,我只是测试它,它工作正常。最佳做法是等待元素可点击。您可以使用WebDriverWait ExpectedConditions来执行此操作。这将做的是等待最多20秒才能显示元素,当它继续执行时。与Thread.sleep()相比,这是一个很大的优势。

driver.get("http://www.makemytrip.com/international-flights");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement oneWayRadioButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("one_way_button1")));
oneWayRadioButton.click();
System.out.println("Clicked One Way");