如何以编程方式单击“取消搜索”按钮?

时间:2017-08-19 22:25:42

标签: javascript html5 selenium

我有<input type="search">。出于UI测试的目的,我想点击“取消搜索”按钮:

White search field on the teal background, with text "user", visible text cursor at the beginning of the input, search cancel button in a shape of the white cross on the gray circle, and awesome pixelated classic red arrow pointing at the cancel button with the text "this"

此代码段的代码就是:

<input type="search" value="user">

取消按钮本身可以通过::-webkit-search-cancel-button伪样式,但由于它是伪的,它不是DOM的一部分,我不知道如何访问它。现在只有基于Blink / Webkit的浏览器呈现此按钮,但由于我的标记在CEF应用程序中使用,因此不是问题。

不幸的是,只是将值设置为空字符串不会触发任何事件。据我所知,点击该按钮会触发“输入”和“搜索”事件,但是自己解雇这些事件似乎会破坏UI测试的目的。

那么,我如何使用Selenium或只是简单的Javascript?

2 个答案:

答案 0 :(得分:2)

我仍然不知道如何正确地做到这一点(并且会感谢任何知道如何访问该按钮的答案),但我想出了一个对我有用的解决方法。

我们的想法是使用Selenium ActionChains将鼠标指针实际移动到取消按钮的假定位置,然后单击此处。因为我无法确切地知道那个按钮在哪里,我认为点击距离右边界一半高度的点并且垂直居中的点可以工作。

因此,在我的代码中,我使用了与此类似的代码:

def cancel_search(el: WebElement):
    driver = el.parent

    width, height = driver.execute_script(r'''
        const $el = $(arguments[0]);
        return [
            $el.outerWidth(true),
            $el.outerHeight(true),
        ];''', el)

    top = height // 2
    left = width - height // 2 - 1

    ac = ActionChains(driver)
    ac.move_to_element_with_offset(el, left, top)
    ac.click()
    ac.perform()

答案 1 :(得分:0)

尝试使用.elementFromPoint(x,y)获取取消按钮。

如果(X)在DOM或(我认为)Shadow DOM中注册,这应该模拟鼠标点击,我相信我昨天读到它在Webkit和Blink浏览器的Shadow DOM中。

var x = //猜测    var y = // guess

var searchInput = document.getElementById('mySearchInput');

var searchCancelButton = e.elementFromPoint(x, y);  //  'get' cancel button element

searchCancelButton.click();  

这样,xy coords应该是输入框的绝对值,而不是整个文档。如果它可以以任何DOM风格的方式访问,那么这应该可行,如果你可以猜测基于0,0的坐标是输入框的左上角。

之前尝试过:

尝试将值设置为“”然后使用.click() DOM元素方法。如果它有一个ID,你可以使用类似这个例子的东西,但是如何“获得”元素或引用它是透明的。

var e = document.getElementById('mySearchInput');
e.value = '';
e.click();