01,frame/iframe Form nesting

WebDriver Elements can only be identified and located on one page , about frame/iframe Page elements embedded in the form cannot be directly located .

resolvent :

driver.switch_to.frame(id/name/obj)

switch_to.frame() By default, the form can be accessed directly id or name attribute . If no is available id and name attribute , You can navigate to frame/iframe, Then transfer the positioning object to switch_to.frame( object ) method .
xf = driver.find_element_by_xpath('//*[@class="if"]')
driver.switch_to.frame(xf) ...
driver.switch_to.parent_frame()  Cut to parent frame. Affect performance , Can be presented to the developer , Let it improve .
driver.switch_to.default_content()  Jump back to the outermost page
02, Page Jump to new tab , Or pop up warning box, etc

Sometimes during page operation, clicking a link will pop up a new window , At this time, you need to switch the focus to the new window for operation .

*
resolvent 1:

driver.switch_to.window(window_handle) Switch to new window .

First, get the handle of the current window driver.current_window_handle, Then open a new pop-up window , Get the handle of all currently open windows
driver.window_handles
. adopt for Loop traversal handle, If not equal to the handle of the first open window , Then it must be the handle of the new window , Because only two windows are opened during execution ; change a condition , If equal to the handle of the first open window , Then you can switch back to the first open window .

*
resolvent 2:

about JavaScript Generated alert,confirm as well as prompt, Unable to use front-end tools to locate pop-up windows , use
driver.switch_to.alert Method positioning Popup .

alert The methods are :

*
.accept()    ' Equivalent to clicking “ confirm ” or “OK”'

*
.dismiss()    ' Equivalent to clicking “ cancel ” or “Cancel”'

*
.text        ' obtain alert Text content , For those with information alert frame '

*
.send_keys(text)    ' Send text , For those who need to submit prompt frame '

*
.authenticate(username,password)    ' verification , For those requiring authentication alert'

03, Page elements lose focus, leading to unstable script operation

resolvent :

driver.switch_to.active_element
  Encountered script instability , Sometimes, the test fails due to the loss of focus , You can switch to the focus element before operation . be careful .active_element No parentheses after ().

The following is a reference case :

' initial “ Right click the mouse → New folder → Enter folder name ” Code of '
l = driver.find_element_by_id('pm_treeRoom_1_span')
ActionChains(driver).context_click(l).perform()
driver.find_element_by_class_name('fnew').click() time.sleep(2)
driver.find_element_by_xpath('//*[@id="pm_treeRoom_1_ul"]/li[...]').send_keys('filename')
time.sleep(2)
As a result, this operation will always cause the input box to lose focus , Disappear directly , Not to mention send_keys Go in , Direct error reporting .

' The modified code is as follows '
driver.find_element_by_class_name('fnew').click() time.sleep(2)
driver.switch_to.active_element.send_keys('filename') time.sleep(2)
04, use Xpath or CSS location

find_element_by_xpath("// label [ attribute =' value ']")

use Xpath/CSS method , It is very suitable for dynamic generation of location attribute values , Elements that are not easy to locate . If you do not want to specify a label , You can use “*” replace , use xpath Not limited to id,name and class These three attributes , Any attribute value of the element can be used , As long as it can uniquely identify an element .

*
resolvent 1:

If an element has no unique attribute , Then we can look up level by level , Until we find the attribute that can uniquely locate the element , Then look down for its child elements .

find_element_by_xpath("//form[@id='form']/span[2]/input")  First, uniquely identify the attribute id=form Locate outermost element , Then find the second element under the outermost element 2 individual span The element of the label is the parent element , Finally, look down and locate the label under the parent element as input Child element of .

*
resolvent 2:

If an attribute cannot uniquely distinguish an element , Then use multiple attributes to uniquely locate an element .
find_element_by_xpath("//input[@id='kw'and@class='su']/span/input")
  First find the label as input,id=kw And class=su Element of , Then find the label below it as span Child element of , Continue to look down and find the label is input Child element of .

*
resolvent 3: inspect Xpath Whether the description is incorrect , Cause unable to navigate to element .

05, Operate the elements on the page before the page is loaded

Script failure due to delay in loading elements , We can improve the stability of automated scripts by setting the waiting time .

resolvent 1:

WebDriverWait() Show waiting . Wait for a single element to load , Usually cooperate until(),until_not() Method use .

Namely ,WebDriverWait(driver, Timeout duration , Call frequency , Ignore exceptions ).until( Executable method , Information returned when timeout occurs )

WebDriverWait(driver,5,1).until(expected_conditions.presence_of_element_located(By.ID,'kw'))
The maximum waiting time is 5s, every other 1 Check every second id='kw' Whether the element of is loaded in DOM In the tree ( It does not mean that the element must be visible ). Most commonly used method
yes expected_conditions Expected condition judgment provided by class .
is_disappeared= WebDriverWait(driver, 30, 1,
(ElementNotVisibleException)).until_not(lambda x:
x.find_element_by_id('someId').is_displayed())
The maximum waiting time is 30s, every other 1 Check every second id='someId' Whether the element of is from DOM Disappear in the tree , Ignore default exception information NoSuchElementException
  And specified exception information ElementNotVisibleException. Anonymous function here lambda Specific reference for usage of Python grammar .

resolvent 2:

driver.implicitly_wait( second )
  Implicit waiting . Global wait , Set timeout for all elements , Wait for the page to load , Therefore, you only need to set it once . The time here is the longest waiting time ( Non fixed waiting time ).

resolvent 3:

sleep( second ) Thread waiting . Sleep fixed time , You need to import it first when using it time Modular sleep method from time import sleep.

06, Element is blocked , Not available , invisible

*
resolvent 1:

driver.maximize_window() Page element layout changes due to window size changes , The tested element is blocked , You can maximize the window first , Then locate the element .

*
resolvent 2:

.is_enabled() Elements are not available in some cases due to business reasons ( Element attribute disabled, Grayed out ), First, check whether the test steps conform to the business logic , Secondly, confirm whether it is in the business process Bug.

*
resolvent 3:

.is_displayed() For elements whose attributes are not necessarily visible , Before positioning, first judge whether its attribute is visible , Whether it is hidden .

*
resolvent 4:

Elements covered due to unreasonable layout , Or the problem of unable to locate caused by the absence of the element itself belongs to Bug, It can be proposed to the development department for improvement .

07, use WebDriver call JavaScript Code replaces functions that cannot be realized

For some WebDriver There are no methods provided or functions that cannot be realized ,WebDriver Provided driver.execute_script()
Method to execute JavaScript code .

resolvent :

If the page content is too long , Window maximization can not see all elements , Can be executed by JavaScript The script realizes the dragging of the scroll bar and other actions .
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
The above statement realizes the function of pulling the page to the bottom , among window.scrollTo( left , top margin )
yes JavaScript Code used to set the horizontal and vertical position of the browser window scroll bar in .
text = "input text" driver.execute_script("var
obj=document.getElementById('text'); obj.value=' " + text + " ';")
Suppose an input box can be accessed through id='text' Position it , But I can't pass send_keys() Enter text content , With the help of JavaScript Code to implement .
video = driver.find_element_by_xpath("body/Section[1]/div/video") url =
driver.execute_script("return arguments[0].currentSrc;", video) print(url)    
      ' Return to the file playback address ' print("start")      ' Play video ' driver.execute_script("return
arguments[0].play()", video) sleep(15)           ' play 15 second ' print(stop)        
' Pause video ' driver.execute_script("arguments[0].pause()", video) ...
The above has been achieved HTML5 Video screen <video> Partial testing of labels , More references HTML DOM Video object .

among arguments yes JavaScript Built in objects for . Because will video Object passed to arguments, therefore arguments[0] amount to JavaScript Scripted document.getElementsByTagName("video").JavaScript Overloading is not supported , use arguments Object can simulate the effect of function overloading .

08,WebDriver Unable to operate Windows control

Common uploading and downloading of files ( reference resources How to auto save files using custom Firefox profile ?), Can pass .
.send_keys(' Local path ') and find_element_by_partial_link_text(' Download link name ').click() realization .

resolvent :

For plugin upload , Action required Windows Control's , You can install AutoIt tool , Script , Save as “.au3” file , convert to “.exe” file , Then automated script
os.system("D:\\upfile.exe") Realize uploading / download .

* Although this method can solve the problem of file uploading , Download operation problems , But not recommended .
Because through python call exe The program is not there python Within the controllable range of , How long does it take , Whether the execution process is wrong , No one knows from the automated process .

09,firefox Strong security , Error reporting is not allowed for cross domain calls

Error description :

uncaught exception: [Exception... "Component returned failure code: 0x80004005
(NS_ERROR_FAILURE) [nsIDOMNSHTMLDocument.execCommand]" nsresult: "0x80004005
(NS_ERROR_FAILURE)" location:
terms of settlement :

Firefox To cancel XMLHttpRequest Cross domain restrictions ,

*
The first is from  about:config  Setting in signed.applets.codebase_principal_support =
true;( Address bar input about:config Ready to proceed firefox set up );

*
The second is in open Add code similar to the following before the code function of :
try {
 netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");  
   } catch (e) {      alert("Permission UniversalBrowserRead denied.");      }
end

If my blog is helpful to you , If you like my blog content , please “ give the thumbs-up ” “ comment ” “ Collection ” One button three times !

Last basic knowledge ,Linux necessary ,Shell, Principles of Internet program ,Mysql database , Special topic of bag capturing tools , Interface test tools , Advanced test -Python programming ,Web automated testing ,APP automated testing , Interface automation test , Test advanced continuous integration , Test architecture development test framework , performance testing , Supporting learning resources such as safety testing 【 free 】.

Technology