hello, 小伙伴们,好久不见,接下来我来给大家分享几个比较骚的selenium操作,准备好了吗?车门焊死,开车了。哈哈哈
1.打开两个页面并且进行切换操作
我们在做一些页面的测试的时候,需要操作的是在当前页面的基础上再去打开一个新的页面同时做一些操作时候,接着再切换到另一个页面,继续做操作,这个条件是当且仅当在当前这个driver对象里进行操作, 而不是两个driver对象废话不多说,代码奉上:
1 from selenium import webdriver 2 import time 3 4 def open_windows1(): 5 driver.get('www.baidu.com') 6 time.sleep(9) 7 8 def open_windows2():# 第二个新的窗口使用JS的方法打开一个新的窗口,模拟新的标签页弹窗 9 new_page= window.open('www.jd.com') 10 driver.execute_script(new_page) 11 time.sleep(2) 12 13 def switch_windows(): 14 handles = driver.window_handles 15 print('print currrent opened windows:' + str(handles)) 16 while 1: 17 driver.switch_to.window(handles[0]) 18 time.sleep(5) 19 driver.switch_to.window(handles[1]) 20 time.sleep(5) 21 if __name__ == "__main__": 22 chromeOptions = webdriver.ChromeOptions() 23 chromeOptions.add_experimental_option('useAutomationExtension', False) 24 driver = webdriver.Chrome(chrome_options=chromeOptions, desired_capabilities=chromeOptions.to_capabilities()) 25 driver.maximize_window() 26 open_widows1() 27 open_wondows2() 28 switch_windows()
小伙伴们可以直接直接把这段代码复制下来实际运行一下看看效果,当然这个driver对象大家也可以使用别的方法获取到,是不是有点骚呢?
2.操作不可见元素
有一些元素在页面上设置的属性是display=none, 这时要是使用普通的xpath肯定获取不到,这时候就要对这个页面进行JS操作了, 即通过JS改变这个元素的可见性即通过JS来改变这个元素的属性,接着进行操作就可以进行操作获取值了.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <select name="new_select" id="" style="display:none"> <option value="bmw">BMW</option> <option value="audi">AUDI</option> <option value="mini">MINI</option> <option value="benz">BENZ</option> </select> </body> </html>
正常的我们想去获取这个select选项框中的值,是获取不到的。
1 from selenium import webdriver 2 from selenium.webdriver.support.select import Select 3 import os 4 import time 5 chromeOptions = webdriver.ChromeOptions() 6 chromeOptions.add_experimental_option('useAutomationExtension', False) 7 driver = webdriver.Chrome(chrome_options=chromeOptions, desired_capabilities=chromeOptions.to_capabilities()) 8 driver.maximize_window() 9 file_path = 'file:///' + os.path.abspath('test_display.html') 10 driver.get(file_path) 11 change_display = 'document.querySelectorAll("select")[0].style.display="block";' 12 # 这条语句就改变了这个select选项框的属性了,接下来就能正常操作了 13 driver.execute_script(change_display) 14 sel = driver.find_element_by_tag_name('select') 15 Select(sel).select_by_value('mini') 16 time.sleep(2) 17 driver.quit()
3.定位不到弹窗元素
在selenium测试中, 看到貌似是一个简单的弹窗,但是使用alert以及普通的定位都找不到,经过再次排查也不是iframe元素(下面我们说iframe元素),再接着是使用sleep时间也无法解决,这时我们的一个解决办法是打印一下当前的页面的所有窗口, 也即看看实际到了这层页面一共有几个窗口。
1 # 也即调用window_handles方法查看当前一共几个窗口 2 all_handles = driver.window_handles 3 print(all_handles) 4 # 这时的结果就是这个列表有两个元素, 也即证明当前页面时两个窗口,所以现在看到的是一个窗口, 实际时2个窗口了,显示的这个元素是在另一个窗口里面,之只要我们切换到另一个窗口进行处理即可,处理完再切换回原来的窗口即可。 5 # 切换方法 6 driver.switch_to.window(all_handles[1]) 7 # 切换回原来的窗口 8 driver.switch_to.window(all_handles[0])
这个可以在我们使用alert等方法也找不到的时候尝试一下使用这个方式,没准就能往下进行了
4.切换到iframe元素
有的页面我们明明可以看到,也能获取到当前的元素,也能获取到当前元素的id,但是就是死活定位不到,此时我们需要定位的元素很有可能包含在iframe元素中,这是我们需要进入到iframe元素里面,这样我们就能进行操作了。
# 比如当前的iframe元素id是'frame' driver.switch_to.frame(driver.find_element_by_id('iframe') # 接着就可以进行正常操作了, # 退出当前的iframe driver.switch_to.default_content() # 这样我们就退出iframe元素, 进行正常的操作了。
更多骚操作正在摸索中,敬请期待。。。。