【问题标题】:Not able to click a button in Selenium (Booking.com)无法单击 Selenium 中的按钮(Booking.com)
【发布时间】:2017-12-28 23:26:50
【问题描述】:

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

进入 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)

它要么什么都不做(如果是execute.script()click() 在 div 元素上),要么在直接单击按钮时抛出以下异常:

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


【解决方案1】:

将 clicka 定义为 xpath。现在使用 executescript 点击元素。

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

【讨论】:

    【解决方案2】:

    我不能 100% 确定我得到了你发布的所有内容,因为布局有点乱。

    但是,我尝试使用 Selenium Java 和 Firefox Scratchpad(一种允许运行 JavaScript 脚本的 Web 开发工具)来测试这个问题,并且效果很好 - 按钮都可以点击。

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

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

    【讨论】:

    • 昨天有点晚了,这是我的第一篇文章。以后我会改进我的问题的布局,谢谢你的建议。我会再次测试它。
    • 我已经测试过了,但是出现了同样的错误信息。使用 Firefox Scratchpad 单击日历效果很好,但使用 Selenium + Python 时就不行了。
    【解决方案3】:

    如果您在通过显式等待管理的所有网站上都有控制签出按钮,则需要大量编码,您可以在 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);
    

    【讨论】:

    • implicitlyWait 方法没有帮助,我已经读过使用显式等待比使用隐式等待更好。
    • 流畅等待比显式等待要好,但也需要了解目的
    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2020-07-30
    • 1970-01-01
    相关资源
    最近更新 更多