无法点击Selenium(Booking.com)中的按钮

时间:2017-12-28 23:26:51

标签: python selenium button selenium-webdriver

我在Selenium的帮助下编写了一个python scraper。前几步是:

  

在booking.com上,插入城市名称,选择第一个日期,然后尝试打开结帐日历。

这是我的问题发生的地方。我无法点击结帐日历按钮(The important are of the website)。

我尝试使用element.click()点击与结帐日历(The elements of check-out calendar)相关的每个元素。我也试过了方法

element = self.browser.find_element_by_xpath('(//div[contains(@class,"checkout-field")]//button[@aria-label="Open calendar"])[1]') self.browser.execute_script("arguments[0].click();", element)

它不执行任何操作(如果在div元素上为execute.script()click()),或者在直接单击按钮时抛出异常:

Element <button class="sb-date-field__icon sb-date-field__icon-btn bk-svg-wrapper"
type="button"> is not clickable at point (367.5,316.29998779296875) 
because another element <div class="sb-date-field__display"> obscures it

这是一个测试它的简短代码:

browser = webdriver.Firefox()
browser.get("https://www.booking.com/")
wait = WebDriverWait(browser, 5)
element = wait.until(EC.presence_of_element_located((
    By.XPATH, '(//div[contains(@class,"checkout-field")]//button[@aria-label="Open calendar"])[1]')))
element = wait.until(EC.element_to_be_clickable((
    By.XPATH, '(//div[contains(@class,"checkout-field")]//button[@aria-label="Open calendar"])[1]')))
element.click()

我暂时解决了我的问题,但我对此并不满意。

element = browser.find_element_by_xpath('(//div[contains(@class,"checkout-field")]//button[@aria-label="Open calendar"])[1]')
hov = ActionChains(browser).move_to_element(element)
hov.click().perform()

这将通过将鼠标悬停在对象上并单击它来打开日历。这奇怪地打开日历。 上述方法仍无效。

3 个答案:

答案 0 :(得分:1)

将clicka定义为xpath。现在使用executioncript单击元素。

driver.execute_script("arguments[0].click();", clicka)

答案 1 :(得分:0)

我不是百分百肯定我得到了你发布的所有内容,因为布局有点混乱。

然而,我试图用Selenium Java和Firefox Scratchpad(一个允许运行JavaScript脚本的Web Developer工具)来测试这个问题,并且它工作得很好 - 按钮可以同时点击它们。

如果您对使用此工具进行进一步测试感兴趣,这是我使用过的代码:

在JavaScript中:

function getElementByXpath(path) {
   return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}

var myElement = getElementByXpath('(//div[contains(@class,"checkout-field")]//button[@aria-label="Open calendar"])[1]')
myElement.click()

和Java:

FirefoxDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 10);
driver.navigate().to("https://www.booking.com");
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[contains(@class,'checkout-field')]//button[@aria-label='Open calendar'])[1]")));
driver.findElement(By.xpath("(//div[contains(@class,'checkout-field')]//button[@aria-label='Open calendar'])[1]")).click();

System.out.println("success");

答案 2 :(得分:0)

如果您在所有网站上都有控制签出按钮,并且需要使用显式等待进行大量编码,您可以使用下面的隐式等待在java中。

    System.setProperty("webdriver.chrome.driver",
   "G:\\TopsAssignment\\SampleJavaExample\\lib\\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);