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

问题描述 投票:0回答:3

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

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

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

我试图用The elements of check-out calendar点击关于结账日历(element.click())的每个元素。我也试过这个方法

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()

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

python selenium button selenium-webdriver
3个回答
1
投票

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

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

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");

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);
© www.soinside.com 2019 - 2024. All rights reserved.