我在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()
这将通过将鼠标悬停在对象上并单击它来打开日历。这奇怪地打开日历。 上述方法仍无效。
答案 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);