2017-04-20 69 views
0

我想从下面的网站使用Selenium与Java(3.3.0和Java版本“1.8.0_66”)点击日历。咏叹调隐藏的跨度/按钮可防止获取元素 - 硒

https://www.cathaypacific.com/cx/en_US.html

目标被点击 - 机票 - 单程 - “出发打开”按钮 不管,我试了一下可能的选项 - by.id,by.xpath和行动,EventFiringMouse等,这个按钮根本没有被点击。

"<div class="button-date-picker-wrapper field-group cx-inputfield"> 
 
<span class="field-label input-filled" aria-hidden="true">Departing on</span> 
 
<button id="dppju1sm" class="button-date-picker field-button from-button has-dates input-filled" role="link" type="button" data-ui-overlay-shared="true" data-ui-overlay-id="trip-dates-picker" aria-expanded="false" aria-label="Departing on Thursday 20 April 2017"> 
 
</div>"

private static void pickFlightCode() throws InterruptedException { 

    WebElement element = driver.findElement(By.xpath("//div[1]/button[starts-with(@id,'dp')]")); 
    //wdwait.until(ExpectedConditions.elementToBeClickable(element)); 
    Actions actions=new Actions(driver); 
    actions.moveToElement(element).moveToElement(driver.findElement(By.xpath("//div[1]/button[starts-with(@id,'dp')]"))).click().build().perform(); 
    element = driver.findElement(By.xpath("//div[1]/button[starts-with(@id,'dp')]")); 
    System.out.println(element.getAttribute("aria-hidden")); 

}

(或)

driver.findElement(By.xpath("//div[1]/button[starts-with(@id,'dp')]")).click(); String js = "document.getElementById("field-label").style.display = "block";'; arguments[0].style.visibility='visible';";

上面的代码不工作,我得到 '元素不可见的' 异常。 Driver.findElement - isEnabled返回true,Driver.findElement - isDisplayed返回false。

这是否与跨区域的'aria-hidden'= true属性有关?我们应该如何处理'隐藏咏叹调'并点击按钮?

回答

0

为了达到所需的控制,你可以使用它的容器。因此,请尝试以下方法:

//div[@data-date-picker-id='book-trip']//button[starts-with(@id,'dp') and starts-with(@aria-label, 'Departing on ')] 

请告诉我,它是否适用于您。

+0

完美!它的工作..谢谢。 顺便说一下,这个XPath看起来像嵌套的xpath,不仅我们指的是两个位置,即// div [..] // button [..],还嵌套了starts-with。对我来说很好的学习..谢谢 –

0

尝试此按钮的XPath的 -

//div[@class = 'dates-picker-wrapper splited-date-picker flight-datepicker']/div[1]/button 

我已经在Firefox中检查这一点,它为我工作。

+0

学习和尝试了一些其他的例子,并有人认为Selenium不会支持'复合类名'。这就是为什么我避免使用带有空格的类名,或者即使我必须使用它们,我使用类名的子字符串。 但是,即使类名有空格,你的xpath也可以工作。但是如何? 我误解了Selenium中的'Compound Class name Exception' –

0

尝试此JavaScript代码以启用所选元素的可见性。

WebElement element = driver.findElement(By.xpath("Element Xpath")); 
String js = "arguments[0].style.height='auto'; arguments[0].style.visibility='visible';"; 
((JavascriptExecutor) driver).executeScript(js, elem); 
+0

这个不适合我:(这段代码没有投掷错误或点击按钮。 我使用了旧的element.xpath: WebElement element = driver.findElement(By .xpath(“// div [1]/button [starts-with(@ id,'dp')]”)); \t \t String js =“arguments [0] .style.height ='auto'; arguments [(0).style.visibility ='visible'“; \t \t((JavascriptExecutor)driver).executeScript(js,element); –