我正在使用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");
}
}
}
有人可以帮我解决这个问题吗?
答案 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)
Thread.sleep(time)
Exception
捕获。而不是尝试这个,更安全的是:
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> Exception
的catch
类型。在其他情况下,它是无用的。
答案 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");