...

Source file src/github.com/playwright-community/playwright-go/tests/element_handle_test.go

Documentation: github.com/playwright-community/playwright-go/tests

     1  package playwright_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/playwright-community/playwright-go"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestElementHandleInnerText(t *testing.T) {
    11  	BeforeEach(t)
    12  	defer AfterEach(t)
    13  	_, err := page.Goto(server.PREFIX + "/dom.html")
    14  	require.NoError(t, err)
    15  	handle, err := page.QuerySelector("#inner")
    16  	require.NoError(t, err)
    17  	t1, err := handle.InnerText()
    18  	require.NoError(t, err)
    19  	require.Equal(t, t1, "Text, more text")
    20  	t2, err := page.InnerText("#inner")
    21  	require.NoError(t, err)
    22  	require.Equal(t, t2, "Text, more text")
    23  }
    24  
    25  func TestElementHandleOwnerFrame(t *testing.T) {
    26  	BeforeEach(t)
    27  	defer AfterEach(t)
    28  	_, err := page.Goto(server.EMPTY_PAGE)
    29  	require.NoError(t, err)
    30  	_, err = utils.AttachFrame(page, "iframe1", server.EMPTY_PAGE)
    31  	require.NoError(t, err)
    32  	frame := page.Frames()[1]
    33  	elementHandle, err := frame.EvaluateHandle("document.body")
    34  	require.NoError(t, err)
    35  	ownerFrame, err := elementHandle.(playwright.ElementHandle).OwnerFrame()
    36  	require.NoError(t, err)
    37  	require.Equal(t, ownerFrame, frame)
    38  	require.Equal(t, "iframe1", ownerFrame.Name())
    39  }
    40  func TestElementHandleContentFrame(t *testing.T) {
    41  	BeforeEach(t)
    42  	defer AfterEach(t)
    43  	_, err := page.Goto(server.EMPTY_PAGE)
    44  	require.NoError(t, err)
    45  	_, err = utils.AttachFrame(page, "frame1", server.EMPTY_PAGE)
    46  	require.NoError(t, err)
    47  	elementHandle, err := page.QuerySelector("#frame1")
    48  	require.NoError(t, err)
    49  	frame, err := elementHandle.ContentFrame()
    50  	require.NoError(t, err)
    51  	require.Equal(t, frame, page.Frames()[1])
    52  }
    53  func TestElementHandleGetAttribute(t *testing.T) {
    54  	BeforeEach(t)
    55  	defer AfterEach(t)
    56  	_, err := page.Goto(server.PREFIX + "/dom.html")
    57  	require.NoError(t, err)
    58  	handle, err := page.QuerySelector("#outer")
    59  	require.NoError(t, err)
    60  	a1, err := handle.GetAttribute("name")
    61  	require.NoError(t, err)
    62  	require.Equal(t, "value", a1)
    63  	a2, err := page.GetAttribute("#outer", "name")
    64  	require.NoError(t, err)
    65  	require.Equal(t, "value", a2)
    66  }
    67  
    68  func TestElementHandleDispatchEvent(t *testing.T) {
    69  	BeforeEach(t)
    70  	defer AfterEach(t)
    71  	_, err := page.Goto(server.PREFIX + "/input/button.html")
    72  	require.NoError(t, err)
    73  	element, err := page.QuerySelector("button")
    74  	require.NoError(t, err)
    75  	require.NoError(t, element.DispatchEvent("click"))
    76  	result, err := page.Evaluate("() => result")
    77  	require.NoError(t, err)
    78  	require.Equal(t, "Clicked", result)
    79  }
    80  
    81  func TestElementHandleDispatchEventInitObject(t *testing.T) {
    82  	BeforeEach(t)
    83  	defer AfterEach(t)
    84  	err := page.SetContent(`
    85  	<button onclick="window.eventBubbles = event.bubbles">ok</button>`)
    86  	require.NoError(t, err)
    87  	element, err := page.QuerySelector("button")
    88  	require.NoError(t, err)
    89  	require.NoError(t, element.DispatchEvent("click", map[string]interface{}{
    90  		"bubbles": true,
    91  	}))
    92  	result, err := page.Evaluate("() => window.eventBubbles")
    93  	require.NoError(t, err)
    94  	require.Equal(t, true, result)
    95  }
    96  
    97  func TestElementHandleHover(t *testing.T) {
    98  	BeforeEach(t)
    99  	defer AfterEach(t)
   100  	_, err := page.Goto(server.PREFIX + "/input/scrollable.html")
   101  	require.NoError(t, err)
   102  	btn, err := page.QuerySelector("#button-6")
   103  	require.NoError(t, err)
   104  	require.NoError(t, btn.Hover())
   105  	result, err := page.Evaluate(`document.querySelector("button:hover").id`)
   106  	require.NoError(t, err)
   107  	require.Equal(t, "button-6", result)
   108  }
   109  
   110  func TestElementHandleClick(t *testing.T) {
   111  	BeforeEach(t)
   112  	defer AfterEach(t)
   113  	_, err := page.Goto(server.PREFIX + "/input/button.html")
   114  	require.NoError(t, err)
   115  	btn, err := page.QuerySelector("button")
   116  	require.NoError(t, err)
   117  	require.NoError(t, btn.Click())
   118  	result, err := page.Evaluate(`result`)
   119  	require.NoError(t, err)
   120  	require.Equal(t, "Clicked", result)
   121  }
   122  
   123  func TestElementHandleDblclick(t *testing.T) {
   124  	BeforeEach(t)
   125  	defer AfterEach(t)
   126  	_, err := page.Goto(server.PREFIX + "/input/button.html")
   127  	require.NoError(t, err)
   128  	_, err = page.Evaluate(`() => {
   129              window.double = false;
   130              button = document.querySelector('button');
   131              button.addEventListener('dblclick', event => {
   132              window.double = true;
   133              });
   134  	}`)
   135  	require.NoError(t, err)
   136  	btn, err := page.QuerySelector("button")
   137  	require.NoError(t, err)
   138  	require.NoError(t, btn.Dblclick())
   139  	result, err := page.Evaluate("double")
   140  	require.NoError(t, err)
   141  	require.Equal(t, true, result)
   142  
   143  	result, err = page.Evaluate(`result`)
   144  	require.NoError(t, err)
   145  	require.Equal(t, "Clicked", result)
   146  }
   147  
   148  func TestElementBoundingBox(t *testing.T) {
   149  	BeforeEach(t)
   150  	defer AfterEach(t)
   151  	require.NoError(t, page.SetViewportSize(500, 500))
   152  	_, err := page.Goto(server.PREFIX + "/grid.html")
   153  	require.NoError(t, err)
   154  	element_handle, err := page.QuerySelector(".box:nth-of-type(13)")
   155  	require.NoError(t, err)
   156  	box, err := element_handle.BoundingBox()
   157  	require.NoError(t, err)
   158  	require.Equal(t, 100, box.X)
   159  	require.Equal(t, 50, box.Y)
   160  	require.Equal(t, 50, box.Width)
   161  	require.Equal(t, 50, box.Height)
   162  }
   163  
   164  func TestElementHandleTap(t *testing.T) {
   165  	BeforeEach(t)
   166  	defer AfterEach(t)
   167  	_, err := page.Goto(server.EMPTY_PAGE)
   168  	require.NoError(t, err)
   169  	require.NoError(t, page.SetContent("<input id='checkbox' type='checkbox'></input>"))
   170  	value, err := page.EvalOnSelector("input", "el => el.checked")
   171  	require.NoError(t, err)
   172  	require.Equal(t, false, value)
   173  
   174  	elemHandle, err := page.QuerySelector("#checkbox")
   175  	require.NoError(t, err)
   176  	require.NoError(t, elemHandle.Tap())
   177  	value, err = page.EvalOnSelector("input", "el => el.checked")
   178  	require.NoError(t, err)
   179  	require.Equal(t, true, value)
   180  }
   181  
   182  func TestElementHandleQuerySelectorNotExists(t *testing.T) {
   183  	BeforeEach(t)
   184  	defer AfterEach(t)
   185  	_, err := page.Goto(server.EMPTY_PAGE)
   186  	require.NoError(t, err)
   187  	require.NoError(t, page.SetContent(`
   188  	<div id="a1">
   189  	</div>
   190  	`))
   191  	rootElement, err := page.QuerySelector("#a1")
   192  	require.NoError(t, err)
   193  	element, err := rootElement.QuerySelector(".foobar")
   194  	require.NoError(t, err)
   195  	require.Nil(t, element)
   196  }
   197  
   198  func TestElementHandleQuerySelectorAll(t *testing.T) {
   199  	BeforeEach(t)
   200  	defer AfterEach(t)
   201  	_, err := page.Goto(server.EMPTY_PAGE)
   202  	require.NoError(t, err)
   203  	require.NoError(t, page.SetContent(`
   204  	<div id="a1">
   205  		<div class="foobar">
   206  		</div>
   207  		<div class="foobar">
   208  		</div>
   209  	</div>
   210  	`))
   211  	rootElement, err := page.QuerySelector("#a1")
   212  	require.NoError(t, err)
   213  	elements, err := rootElement.QuerySelectorAll(".foobar")
   214  	require.NoError(t, err)
   215  	require.Equal(t, 2, len(elements))
   216  	className, err := elements[0].GetAttribute("class")
   217  	require.NoError(t, err)
   218  	require.Equal(t, "foobar", className)
   219  }
   220  
   221  func TestElementHandleEvalOnSelector(t *testing.T) {
   222  	BeforeEach(t)
   223  	defer AfterEach(t)
   224  	_, err := page.Goto(server.EMPTY_PAGE)
   225  	require.NoError(t, err)
   226  	require.NoError(t, page.SetContent(`
   227  	<div id="a1">
   228  		<div id="a2">
   229  			foobar
   230  		</div>
   231  	</div>
   232  	`))
   233  	rootElement, err := page.QuerySelector("#a1")
   234  	require.NoError(t, err)
   235  	innerText, err := rootElement.EvalOnSelector("#a2", "e => e.innerText")
   236  	require.NoError(t, err)
   237  	require.Equal(t, "foobar", innerText)
   238  }
   239  
   240  func TestElementHandleEvalOnSelectorAll(t *testing.T) {
   241  	BeforeEach(t)
   242  	defer AfterEach(t)
   243  	_, err := page.Goto(server.EMPTY_PAGE)
   244  	require.NoError(t, err)
   245  	require.NoError(t, page.SetContent(`
   246  	<div id="a1">
   247  		<div class="foobar">
   248  		</div>
   249  		<div class="foobar">
   250  		</div>
   251  	</div>
   252  	`))
   253  	rootElement, err := page.QuerySelector("#a1")
   254  	require.NoError(t, err)
   255  	classNames, err := rootElement.EvalOnSelectorAll(".foobar", "elements => [...elements].map(e => e.getAttribute('class'))")
   256  	require.NoError(t, err)
   257  	require.Equal(t, []interface{}([]interface{}{"foobar", "foobar"}), classNames)
   258  }
   259  
   260  func TestElementHandleString(t *testing.T) {
   261  	BeforeEach(t)
   262  	defer AfterEach(t)
   263  	numberHandle, err := page.EvaluateHandle("() => 2")
   264  	require.NoError(t, err)
   265  	require.Equal(t, "2", numberHandle.String())
   266  	stringHandle, err := page.EvaluateHandle("() => 'a'")
   267  	require.NoError(t, err)
   268  	require.Equal(t, "a", stringHandle.String())
   269  }
   270  
   271  func TestElementHandleCheck(t *testing.T) {
   272  	BeforeEach(t)
   273  	defer AfterEach(t)
   274  	require.NoError(t, page.SetContent(`
   275  		<input type="checkbox"/>
   276  	`))
   277  	inputElement, err := page.QuerySelector("input")
   278  	require.NoError(t, err)
   279  	isChecked, err := inputElement.Evaluate("e => e.checked")
   280  	require.NoError(t, err)
   281  	require.Equal(t, false, isChecked)
   282  	require.NoError(t, inputElement.Check())
   283  	isChecked, err = inputElement.Evaluate("e => e.checked")
   284  	require.NoError(t, err)
   285  	require.Equal(t, true, isChecked)
   286  }
   287  
   288  func TestElementHandleUnCheck(t *testing.T) {
   289  	BeforeEach(t)
   290  	defer AfterEach(t)
   291  	require.NoError(t, page.SetContent(`
   292  		<input type="checkbox" checked/>
   293  	`))
   294  	inputElement, err := page.QuerySelector("input")
   295  	require.NoError(t, err)
   296  	require.NoError(t, inputElement.Uncheck())
   297  	isChecked, err := inputElement.Evaluate("e => e.checked")
   298  	require.NoError(t, err)
   299  	require.Equal(t, false, isChecked)
   300  }
   301  
   302  func TestElementHandleSelectOption(t *testing.T) {
   303  	BeforeEach(t)
   304  	defer AfterEach(t)
   305  	_, err := page.Goto(server.EMPTY_PAGE)
   306  	require.NoError(t, err)
   307  	require.NoError(t, page.SetContent("<select id='lang'><option value='go'>go</option><option value='python'>python</option></select>"))
   308  	elemHandle, err := page.QuerySelector("#lang")
   309  	require.NoError(t, err)
   310  	selected, err := elemHandle.SelectOption(playwright.SelectOptionValues{
   311  		Values: playwright.StringSlice("go"),
   312  	})
   313  	require.NoError(t, err)
   314  	require.Equal(t, 1, len(selected))
   315  	require.Equal(t, "go", selected[0])
   316  }
   317  
   318  func TestElementHandleSelectOptionOverElementHandle(t *testing.T) {
   319  	BeforeEach(t)
   320  	defer AfterEach(t)
   321  	_, err := page.Goto(server.EMPTY_PAGE)
   322  	require.NoError(t, err)
   323  	require.NoError(t, page.SetContent("<select id='lang'><option value='go'>go</option><option value='python'>python</option></select>"))
   324  
   325  	pythonOption, err := page.QuerySelector("option[value=python]")
   326  	require.NoError(t, err)
   327  
   328  	selected, err := page.SelectOption("#lang", playwright.SelectOptionValues{
   329  		Elements: &[]playwright.ElementHandle{pythonOption},
   330  	})
   331  	require.NoError(t, err)
   332  	require.Equal(t, 1, len(selected))
   333  	require.Equal(t, "python", selected[0])
   334  }
   335  
   336  func TestElementHandleIsVisibleAndIsHiddenShouldWork(t *testing.T) {
   337  	BeforeEach(t)
   338  	defer AfterEach(t)
   339  	require.NoError(t, page.SetContent(`<div>Hi</div><span></span>`))
   340  	div, err := page.QuerySelector("div")
   341  	require.NoError(t, err)
   342  	isVisible, err := div.IsVisible()
   343  	require.NoError(t, err)
   344  	require.True(t, isVisible)
   345  	isHidden, err := div.IsHidden()
   346  	require.NoError(t, err)
   347  	require.False(t, isHidden)
   348  
   349  	isVisible, err = page.IsVisible("div")
   350  	require.NoError(t, err)
   351  	require.True(t, isVisible)
   352  	isHidden, err = page.IsHidden("div")
   353  	require.NoError(t, err)
   354  	require.False(t, isHidden)
   355  
   356  	span, err := page.QuerySelector("span")
   357  	require.NoError(t, err)
   358  	isVisible, err = span.IsVisible()
   359  	require.NoError(t, err)
   360  	require.False(t, isVisible)
   361  	isHidden, err = span.IsHidden()
   362  	require.NoError(t, err)
   363  	require.True(t, isHidden)
   364  
   365  	isVisible, err = page.IsVisible("span")
   366  	require.NoError(t, err)
   367  	require.False(t, isVisible)
   368  	isHidden, err = page.IsHidden("span")
   369  	require.NoError(t, err)
   370  	require.True(t, isHidden)
   371  }
   372  
   373  func TestElementHandleIsEnabledAndIsDisabledshouldWork(t *testing.T) {
   374  	BeforeEach(t)
   375  	defer AfterEach(t)
   376  	require.NoError(t, page.SetContent(`
   377  		<button disabled>button1</button>
   378  		<button>button2</button>
   379  		<div>div</div>
   380  	`))
   381  	div, err := page.QuerySelector("div")
   382  	require.NoError(t, err)
   383  	isEnabled, err := div.IsEnabled()
   384  	require.NoError(t, err)
   385  	require.True(t, isEnabled)
   386  	isDisabled, err := div.IsDisabled()
   387  	require.NoError(t, err)
   388  	require.False(t, isDisabled)
   389  
   390  	isEnabled, err = page.IsEnabled("div")
   391  	require.NoError(t, err)
   392  	require.True(t, isEnabled)
   393  	isDisabled, err = page.IsDisabled("div")
   394  	require.NoError(t, err)
   395  	require.False(t, isDisabled)
   396  
   397  	button1, err := page.QuerySelector(":text('button1')")
   398  	require.NoError(t, err)
   399  	isEnabled, err = button1.IsEnabled()
   400  	require.NoError(t, err)
   401  	require.False(t, isEnabled)
   402  	isDisabled, err = button1.IsDisabled()
   403  	require.NoError(t, err)
   404  	require.True(t, isDisabled)
   405  
   406  	isEnabled, err = page.IsEnabled(":text('button1')")
   407  	require.NoError(t, err)
   408  	require.False(t, isEnabled)
   409  	isDisabled, err = page.IsDisabled(":text('button1')")
   410  	require.NoError(t, err)
   411  	require.True(t, isDisabled)
   412  
   413  	button2, err := page.QuerySelector(":text('button2')")
   414  	require.NoError(t, err)
   415  	isEnabled, err = button2.IsEnabled()
   416  	require.NoError(t, err)
   417  	require.True(t, isEnabled)
   418  	isDisabled, err = button2.IsDisabled()
   419  	require.NoError(t, err)
   420  	require.False(t, isDisabled)
   421  
   422  	isEnabled, err = page.IsEnabled(":text('button2')")
   423  	require.NoError(t, err)
   424  	require.True(t, isEnabled)
   425  	isDisabled, err = page.IsDisabled(":text('button2')")
   426  	require.NoError(t, err)
   427  	require.False(t, isDisabled)
   428  }
   429  
   430  func TestElementHandleIsEditableShouldWork(t *testing.T) {
   431  	BeforeEach(t)
   432  	defer AfterEach(t)
   433  	require.NoError(t, page.SetContent(`
   434  		<input id=input1 disabled><textarea></textarea><input id=input2>
   435  	`))
   436  	_, err := page.EvalOnSelector("textarea", "t => t.readOnly = true")
   437  	require.NoError(t, err)
   438  	input1, err := page.QuerySelector("#input1")
   439  	require.NoError(t, err)
   440  	isEditable, err := input1.IsEditable()
   441  	require.NoError(t, err)
   442  	require.False(t, isEditable)
   443  	isEditable, err = page.IsEditable("#input1")
   444  	require.NoError(t, err)
   445  	require.False(t, isEditable)
   446  
   447  	input2, err := page.QuerySelector("#input2")
   448  	require.NoError(t, err)
   449  	isEditable, err = input2.IsEditable()
   450  	require.NoError(t, err)
   451  	require.True(t, isEditable)
   452  	isEditable, err = page.IsEditable("#input2")
   453  	require.NoError(t, err)
   454  	require.True(t, isEditable)
   455  
   456  	textarea, err := page.QuerySelector("textarea")
   457  	require.NoError(t, err)
   458  	isEditable, err = textarea.IsEditable()
   459  	require.NoError(t, err)
   460  	require.False(t, isEditable)
   461  	isEditable, err = page.IsEditable("textarea")
   462  	require.NoError(t, err)
   463  	require.False(t, isEditable)
   464  }
   465  
   466  func TestElementHandleIsCheckedShouldWork(t *testing.T) {
   467  	BeforeEach(t)
   468  	defer AfterEach(t)
   469  	require.NoError(t, page.SetContent(`
   470  		<input type="checkbox" checked><div>Not a checkbox</div>
   471  	`))
   472  	handle, err := page.QuerySelector("input")
   473  	require.NoError(t, err)
   474  	isChecked, err := handle.IsChecked()
   475  	require.NoError(t, err)
   476  	require.True(t, isChecked)
   477  	isChecked, err = page.IsChecked("input")
   478  	require.NoError(t, err)
   479  	require.True(t, isChecked)
   480  
   481  	_, err = handle.Evaluate("input => input.checked = false")
   482  	require.NoError(t, err)
   483  	isChecked, err = handle.IsChecked()
   484  	require.NoError(t, err)
   485  	require.False(t, isChecked)
   486  	isChecked, err = page.IsChecked("input")
   487  	require.NoError(t, err)
   488  	require.False(t, isChecked)
   489  
   490  	_, err = page.IsChecked("div")
   491  	require.Contains(t, err.Error(), "Not a checkbox or radio button")
   492  }
   493  
   494  func TestElementHandleWaitForElementState(t *testing.T) {
   495  	BeforeEach(t)
   496  	defer AfterEach(t)
   497  	_, err := page.Goto(server.EMPTY_PAGE)
   498  	require.NoError(t, err)
   499  	require.NoError(t, page.SetContent("<div><p id='result'>test result</p></div>"))
   500  
   501  	handle, err := page.QuerySelector("#result")
   502  	require.NoError(t, err)
   503  	err = handle.WaitForElementState("visible")
   504  	require.NoError(t, err)
   505  }
   506  
   507  func TestElementHandleWaitForSelector(t *testing.T) {
   508  	BeforeEach(t)
   509  	defer AfterEach(t)
   510  	_, err := page.Goto(server.EMPTY_PAGE)
   511  	require.NoError(t, err)
   512  	require.NoError(t, page.SetContent("<div><p id='result'>test result</p></div>"))
   513  
   514  	div, err := page.QuerySelector("div")
   515  	require.NoError(t, err)
   516  
   517  	handle, err := div.WaitForSelector("#result", playwright.ElementHandleWaitForSelectorOptions{
   518  		State: playwright.WaitForSelectorStateAttached,
   519  	})
   520  	require.NoError(t, err)
   521  	text, err := handle.InnerText()
   522  	require.NoError(t, err)
   523  	require.Equal(t, "test result", text)
   524  }
   525  
   526  func TestElemetHandleFocus(t *testing.T) {
   527  	BeforeEach(t)
   528  	defer AfterEach(t)
   529  	_, err := page.Goto(server.EMPTY_PAGE)
   530  	require.NoError(t, err)
   531  	require.NoError(t, page.SetContent(`<button onfocus="window.clicked=true"/>`))
   532  	buttonElement, err := page.QuerySelector("button")
   533  	require.NoError(t, err)
   534  	require.NoError(t, buttonElement.Focus())
   535  	result, err := page.Evaluate("window.clicked")
   536  	require.NoError(t, err)
   537  	require.True(t, result.(bool))
   538  }
   539  
   540  func TestElementHandleInputValue(t *testing.T) {
   541  	BeforeEach(t)
   542  	defer AfterEach(t)
   543  	require.NoError(t, page.SetContent(`
   544  	<input></input>
   545  	`))
   546  	inputElement, err := page.QuerySelector("input")
   547  	require.NoError(t, err)
   548  	require.NoError(t, inputElement.Fill("test"))
   549  	value, err := inputElement.InputValue()
   550  	require.NoError(t, err)
   551  	require.Equal(t, "test", value)
   552  	require.NoError(t, inputElement.Fill(""))
   553  	value, err = inputElement.InputValue()
   554  	require.NoError(t, err)
   555  	require.Equal(t, "", value)
   556  }
   557  
   558  func TestElementHandleSetChecked(t *testing.T) {
   559  	BeforeEach(t)
   560  	defer AfterEach(t)
   561  	require.NoError(t, page.SetContent(`<input id='checkbox' type='checkbox'></input>`))
   562  	selectElement, err := page.QuerySelector("input")
   563  	require.NoError(t, err)
   564  	require.NoError(t, selectElement.SetChecked(true))
   565  	isChecked, err := page.Evaluate("checkbox.checked")
   566  	require.NoError(t, err)
   567  	require.True(t, isChecked.(bool))
   568  	require.NoError(t, selectElement.SetChecked(false))
   569  	isChecked, err = page.Evaluate("checkbox.checked")
   570  	require.NoError(t, err)
   571  	require.False(t, isChecked.(bool))
   572  }
   573  

View as plain text