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