将现有驱动程序的页面加载策略从急切切换到正常



我将pageLoadStrategy设置为eager但现在我编写的关闭网站弹出窗口的方法不起作用(当pageLoadStrategynormal时有效(。所以我想知道如何将pageLoadStrategyeager更改为normal,关闭弹出窗口,然后将其改回我想使用eagereager因为我希望我的代码也适用于低速连接。

以下是driver.page_source设置为eagerpageLoadStrategy拍摄的页面内容:

<head>
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
<meta charset="utf-8"/>
<title>
Amizone
</title>
<meta content="overview &amp; stats" name="description"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0" name="viewport"/>
<!-- bootstrap & fontawesome -->
<link href="/Content/bootstrap.min.css" rel="stylesheet"/>
<link href="/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet"/>
<link href="/Content/color.css" rel="stylesheet"/>
<!-- page specific plugin styles -->
<!-- text fonts -->
<link href="https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700" rel="stylesheet" type="text/css"/>
<!-- ace styles -->
<link href="/Content/ace.min.css" rel="stylesheet"/>
<link href="/Content/Dashboard.css" rel="stylesheet"/>
<link href="/assets/bootstrap-datepicker.min.css" rel="stylesheet"/>
<!-- end css for this page-->
<script src="/Scripts/jquery.2.1.1.min.js">
</script>
</head>
</html>

这是页面的一些内容(我想要的(在pageLoadStrategy设置为normal的同一点:

<head>
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
<meta charset="utf-8"/>
<title>
Amizone
</title>
<meta content="overview &amp; stats" name="description"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0" name="viewport"/>
<!-- bootstrap & fontawesome -->
<link href="/Content/bootstrap.min.css" rel="stylesheet"/>
<link href="/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet"/>
<link href="/Content/color.css" rel="stylesheet"/>
<!-- page specific plugin styles -->
<!-- text fonts -->
<link href="https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700" rel="stylesheet" type="text/css"/>
<!-- ace styles -->
<link href="/Content/ace.min.css" rel="stylesheet"/>
<link href="/Content/Dashboard.css" rel="stylesheet"/>
<link href="/assets/bootstrap-datepicker.min.css" rel="stylesheet"/>
<!-- end css for this page-->
<script src="/Scripts/jquery.2.1.1.min.js">
</script>
<script src="/Scripts/jquery.unobtrusive-ajax.min.js">
</script>
<script src="/Scripts/ace-extra.min.js">
</script>
<script src="/Scripts/bootstrap.min.js">
</script>
<script src="/Scripts/bootbox.min.js">
</script>
<!-- page calender plugin scripts -->
<!--start  ace scripts -->
<script src="/Scripts/ace-elements.min.js">
</script>
<script src="/Scripts/ace.min.js">
</script>
<script src="/Scripts/jquery.easypiechart.min.js">
</script>
<script src="/assets/animate-plus.min.js">
</script>
<script src="/assets/owl.carousel.js">
</script>
<script src="/assets/bootstrap-datepicker.min.js">
</script>
<script src="/Scripts/form-wizard.js">
</script>
<script src="/Scripts/validator.js">
</script>
<link href="/Content/color.css" rel="stylesheet"/>
<script src="/Scripts/jquery.colorbox.min.js">
</script>
<link href="/Content/colorbox.min.css" rel="stylesheet"/>
<!-- include the style -->
<link href="/Content/alertifyjs/alertify.min.css" rel="stylesheet"/>
<!-- include a theme -->
<link href="/Content/alertifyjs/themes/default.min.css" rel="stylesheet"/>
<script src="/Scripts/alertify.js">
</script>
<link href="/Content/main.css" rel="stylesheet"/>
<style>
#myDiv {
visibility: hidden;
opacity: 0;
}
</style>
<script>
alertify.set('notifier', 'position', 'top-right');
</script>
<script>
var baseurl = "";
</script>
<script>
var myVar;
function myFunction() {
$("#lodingDiv").css("display", "block");
myVar = setTimeout(showPage, 300);
}
function showPage() {
$("#lodingDiv").css("display", "none");
$("#myDiv").css("visibility", "visible");
$("#myDiv").css("opacity", "1");
}
</script>
<script charset="UTF-8" src="https://www.gstatic.com/charts/46.1/loader.js" type="text/javascript">
</script>
<link href="https://www.gstatic.com/charts/46.1/css/core/tooltip.css" id="load-css-0" rel="stylesheet" type="text/css"/>
<link href="https://www.gstatic.com/charts/46.1/css/util/util.css" id="load-css-1" rel="stylesheet" type="text/css"/>
<script charset="UTF-8" src="https://www.gstatic.com/charts/46.1/js/jsapi_compiled_format_module.js" type="text/javascript">
</script>
<script charset="UTF-8" src="https://www.gstatic.com/charts/46.1/js/jsapi_compiled_default_module.js" type="text/javascript">
</script>
<script charset="UTF-8" src="https://www.gstatic.com/charts/46.1/js/jsapi_compiled_ui_module.js" type="text/javascript">
</script>
<script charset="UTF-8" src="https://www.gstatic.com/charts/46.1/js/jsapi_compiled_corechart_module.js" type="text/javascript">
</script>
</head>
<body class="no-skin modal-open" oncontextmenu="return false;" onload="myFunction()" style="padding-right: 15px;">
<div id="lodingDiv" style="display: block;">
<div id="loader">
</div>
</div>
<script>
function beginReadNotificationNav(stype, iNoticeId) {
var hfvalue = $('#Hf' + stype + '_' + iNoticeId).val();
var count = $('#PendHome' + stype + 's').text();
var actualCount = parseInt($.trim(count));
if (hfvalue == "False" && actualCount > 0) {
$('#PendHome' + stype + 's').text(actualCount - 1);
$('#PendHome1' + stype + 's').text(actualCount - 1);
$('#Pend' + stype + 's').text(actualCount - 1);
$('#Hf' + stype + '_' + iNoticeId).val('True');
}
}
</script>
<script>
function imageExists(url, callback) {
var img = new Image();
img.onload = function() { callback(true); };
img.onerror = function() { callback(false); };
img.src = url;
}

function validateImageURL()
{
var imageUrl = 'https://amizone.net/amizone/Images/Signatures/7071804_P.png';
imageExists(imageUrl, function(exists) {
//Show the result
// alert('Fileexists=' + exists);
var html='';  
if (exists)
{
html= '<img class="nav-user-photo" src="https://amizone.net/amizone/Images/Signatures/7071804_P.png"/>';
}
else
{
html = '<img class="nav-user-photo" src="../Images/blankphoto.png"  />';
}
// alert(html);
$('#userphoto').append(html);
});
}
validateImageURL();
</script>
<style>
.margin-left-20{margin-left:20px}
.top-notice li {
line-height: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.Nav-Note-Title {
font-size: 13px;
color: #0eb2a4;
}
.Nav-Note-Date {
font-size: 12px;
color: #18960a;
}
.Nav-Note-View a {
font-size: 11px;
color: #fff;
text-decoration: none;
padding: 2px 10px;
border-radius: 10px;
}
@media(min-width:767px) {
.modal-close-btn-home {
display:none;
}
}
</style>
<div class="navbar navbar-default ace-save-state navbar-fixed-top" id="navbar">
<script type="text/javascript">
try { ace.settings.check('navbar', 'fixed') } catch (e) { }
</script>
<div class="navbar-container" id="navbar-container">
<button class="navbar-toggle menu-toggler pull-left" data-target="#sidebar" id="menu-toggler" type="button">
<span class="sr-only">
Toggle sidebar
</span>
<span class="icon-bar">
</span>
<span class="icon-bar">
</span>
<span class="icon-bar">
</span>
</button>
<div class="navbar-header pull-left">
<a class="navbar-brand" href="/Home/">
<img src="/images/amizone-logo-inner.png"/>
</a>
</div>
<div class="pull-left">
<h4 class="align-middle white margin-left-20">
Amity University Uttar Pradesh, Noida
</h4>
</div>
<div class="navbar-buttons pull-right" role="navigation">
<ul class="nav ace-nav">
<li class="grey dropdown-modal">
<a aria-expanded="false" class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="ace-icon fa fa-bell">
</i>
<span class="badge badge-grey" id="PendHomeNotifications">
10
</span>
</a>
<ul class="dropdown-menu-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
<li class="dropdown-header">
<i class="ace-icon fa fa-check">
</i>
<span id="PendHome1Notifications">
10
</span>
Notices To Read
<button aria-label="Close" class="close modal-close-btn-home" data-dismiss="modal" type="button">
<span aria-hidden="true">
×
</span>
</button>
</li>
<li class="dropdown-content ace-scroll" style="position: relative;">
<div class="scroll-track" style="display: none;">
<div class="scroll-bar">
</div>
</div>
<div class="scroll-content" style="max-height: 200px;">
<div class="scroll-content" style="">
<ul class="dropdown-menu dropdown-navbar top-notice">
<li>
<input id="HfNotification_6699" type="hidden" value="False"/>
<span class="Nav-Note-Title">
NOTICE FOR ALL -- LOST &amp; FOUND
</span>
<div class="clearfix">
<span class="pull-left Nav-Note-Date">
13 Jan 2020
</span>
<span class="pull-right Nav-Note-View">
<a class="bg-b-blue" data-ajax="true" data-ajax-begin="beginReadNotificationNav('Notification','6699');" data-ajax-loading="#lodingDiv" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-success=" $('#FormModal').modal('show');" data-ajax-update="#DivForm" href="/Home/NoticeDescription/6787102C-D0F6-4AF2-8E58-4D6F9FF3D4C8?Type=2" id="6787102C-D0F6-4AF2-8E58-4D6F9FF3D4C8" rel="0">
View
</a>
</span>
</div>
</li>
<li>
<input id="HfNotification_6700" type="hidden" value="False"/>
<span class="Nav-Note-Title">
COMPLETE BAN ON E-CIGARETTES
</span>
<div class="clearfix">
<span class="pull-left Nav-Note-Date">
10 Jan 2020
</span>
<span class="pull-right Nav-Note-View">
<a class="bg-b-blue" data-ajax="true" data-ajax-begin="beginReadNotificationNav('Notification','6700');" data-ajax-loading="#lodingDiv" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-success=" $('#FormModal').modal('show');" data-ajax-update="#DivForm" href="/Home/NoticeDescription/F81A5BB8-68BE-4B92-8DD0-2A76F1880197?Type=2" id="F81A5BB8-68BE-4B92-8DD0-2A76F1880197" rel="0">
View
</a>
</span>
</div>
</li>
<li>```
this is the python automation code:
#import sys
import time
import db
from bs4 import BeautifulSoup
from selenium.common import exceptions
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
#from selenium.webdriver.support import expected_conditions as EC
start_time = time.time()    #stores time at which program starts
#while(True):
#***setting up chrome driver***
caps = DesiredCapabilities().CHROME
caps["pageLoadStrategy"] = "normal"  #complete
#caps["pageLoadStrategy"] = "eager"  #interactive
#caps["pageLoadStrategy"] = "none"
chromedriver = "/usr/share/chromedriver/chromedriver"
driver = webdriver.Chrome(desired_capabilities=caps,executable_path=chromedriver)
driver.set_window_size(800, 1000)
# driver.set_network_conditions(
#     offline=False,
#     latency=5,  # additional latency (ms)
#     download_throughput=500 * 1024,  # maximal throughput
#     upload_throughput=500 * 1024)  # maximal throughput
#driver.maximize_window()
#wait = WebDriverWait(driver, 10)
wait = driver.implicitly_wait(10)
url = "https://student.amizone.net"
driver.get(url) #getting amizone.net
#***write page content to a file and return page soup***
def page_content_to_file(*argsv):
wait
content = driver.page_source
#print(content)
page_soup = BeautifulSoup(content, "html.parser")
page_soup_text = BeautifulSoup.prettify(page_soup)
if(len(argsv) > 1):
raise NameError('page_content_to_file cannot take more than 2 arguments')
if(len(argsv) == 1):
filename = argsv[0]
with open(filename, "w") as file:
file.write(page_soup_text)
print("wrote to file {}".format(filename))
return page_soup
#***function that enters login credentials***
def login(username, password):
try:
#type | name=_UserName
driver.find_element(By.NAME, "_UserName").send_keys(username)
#type | name=_Password
driver.find_element(By.NAME, "_Password").send_keys(password)
#click | css=#loginform .login100-form-btn |  
driver.find_element(By.CSS_SELECTOR, "#loginform .login100-form-btn").click()
except:
print("couldn't complete login")
#***function to close popups***
def close_popups():
#try:
page_soup = page_content_to_file("popup.html")
#   getting names of divs having class 'modal fade in'
# driver.implicitly_wait(10)
# content = driver.page_source
# page_soup = BeautifulSoup(content,"html.parser")
popup_divs = page_soup.find_all('div', {"class":"modal fade in"})
#print(popup_divs)
popups_name = []
for div in popup_divs:
popups_name.append(div['id'])
print(popups_name)
if(len(popups_name) == 0):
print("no popups found popups_name length=0")
else:
print("starting")
#   clicking to close pop-ups
for name in reversed(popups_name):
xpath = "//div[@id='" + name + "']//button[@class='close']"
print(xpath)
driver.find_element(By.XPATH, xpath).click()
print("clicks complete")
#extra code
#wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#ModalPopAmityHostel button.btn"))).click()
#driver.execute_script("arguments[0].click()", driver.find_element_by_css_selector("#StudentSatisfactionPop button.btn"))
#click | id=ModalPopAmityHostel |  
#driver.find_element(By.XPATH, "//div[@id='ModalPopAmityHostel']//button[@class='close']").click()
#click | id=StudentSatisfactionPop | 
#driver.find_element(By.XPATH, "//div[@id='StudentSatisfactionPop']//button[@class='close']").click()
# except:
# print("error occured while closing popups")
return 0
#----------FUNCTION CALLS----------
login("username", "password") #login
close_popups() #close all popups
#----------------------------------
#***go to next/prev date in myClasses***
page_soup = page_content_to_file("amizone.html")
date_prev_next = ""
while(date_prev_next != "end"):
date_prev_next = input("type prev/next:")
try:
if(date_prev_next == "next"):
#click | css=.fc-icon-right-single-arrow |
driver.find_element(By.CSS_SELECTOR, ".fc-icon-right-single-arrow").click()
print(driver.find_element(By.XPATH, "//*[@id='calendar']/div[1]/div[3]/h2").text)
if(date_prev_next == "prev"):
# click | css=.fc-prev-button |
driver.find_element(By.CSS_SELECTOR, ".fc-prev-button").click()
print(driver.find_element(By.XPATH, "//*[@id='calendar']/div[1]/div[3]/h2").text)
except exceptions.NoSuchElementException as e:
print(e, "unable to click. Something may be blocking the element")
#***clicking on the hamburger button and choosing timetable***
def menu_click(option):
menu_toggler_xpath = "//*[@id='menu-toggler']" #xpath of the menu toggler(hamburger button)
#   clicking on the hamburger button on top left corner
driver.find_element(By.XPATH, menu_toggler_xpath).click()
if(option == "timetable"):
time_table_navbar_xpath = "//*[@id='10']" #xpath of the timetable option in menu
#   clicking on the timetable button in the menu
driver.find_element(By.XPATH, time_table_navbar_xpath).click()
print("clicked on timetable.")
wait
menu_click("timetable")
#***scraping timetable***
# print(driver.find_element(By.CLASS_NAME, "tab-content").text)
#NOTE: no need to click on weekdays because all info is in the webpage
#NOTE: just clicking on the tt loads only the current day's tt. if then you click once on any day webpage shows tt of whole week.(why?)
#for i in range(1,8): #iterating over all weekdays 1-7
#weekday_xpath = "//*[@id='myTab3']/li[" + str(i) + "]/a" #concatenating string to make xpath for each weekday
#clicking on a day to get whole week's tt
page_soup = page_content_to_file("01.html")
weekday_xpath = "//*[@id='myTab3']/li[1]/a" #xpath of day no.1 of the week in the timetable at that time.
driver.find_element(By.XPATH, weekday_xpath).click()
#   get info about classes and attendance marked from myclasses
#TODO: for a course check whether green or blue dot is shown
#extra code
#date = driver.find_element(By.XPATH, "//*[@id='calendar']/div[1]/div[3]/h2").text #to get the date of myClasses
#print(calendar_date_element.text)
#driver.find_element(By.ID, "ModalPopAmityHostel").click()
#time.sleep(5)
#driver.implicitly_wait(5000)
#driver.find_element(By.ID, "StudentSatisfactionPop").click()
#url = driver.current_url
#driver.find_element(By.CLASS_NAME, "close").click()
#driver.implicitly_wait(5000)
period_data = [] #list to make sql statement
#scraping timetable data
page_soup = page_content_to_file()
divs_class_tab_pane = page_soup.findAll("div", {"class":"tab-pane"})  #finds and makes a list all the <div class="tab-pane in active" id="[day]">
for day_div in divs_class_tab_pane:    #selects each day's div from divs_class_tab_pane list
print()
day = day_div["id"].strip()    #gets the id attribute of div tag e.g <div class="tab-pane in active" id="Sunday"> returns the day
print(day)
try:
#find all <div class="thumbnail timetable-box"> elements which contains p tags of details of a class
div_thumbnail_timetable_box = day_div.findAll("div", {"class":"thumbnail timetable-box"})
if(len(div_thumbnail_timetable_box) == 0):
print("no classes alloted yet")
except:
print("no classes today")
#selecting element one at a time from div_thumbnail_timetable_box
for ttbox in div_thumbnail_timetable_box:   
period_data.append(day) #appending day to list
print()
#get text from <p class="class-time"> the class time
class_time = ttbox.find('p', {"class":"class-time"}).text.strip()
period_data.append(class_time) #appending class time to list
print(class_time)
#get text from <p class="course-code"> the course code
course_code = ttbox.find('p', {"class":"course-code"}).text.strip()
period_data.append(course_code) #appending course_code to list
print(course_code)
#get text from <p class="course-teacher"> the course teacher
course_teacher = ttbox.find('p', {"class":"course-teacher"}).text.strip()
period_data.append(course_teacher) #appending course_teacher to list
print(course_teacher)
class_location = ttbox.find('p', {"class":"class-loc"}).text.strip()
period_data.append(class_location)
print(class_location)
print(period_data)
#connecting to database #TODO: exception handliling required here
mydb = db.establish_con("localhost", "manik", "sweetbread","amizone")
script = "','".join(period_data)
period_data.clear()
query = "INSERT INTO amizone.tt_data(`day`,`time`,course,teacher, class_loc) VALUES ('" + script + "');"
#running MySQL query in the database
mycursor = db.run_sql(mydb, query)
#mycursor = db.run_sql(mydb, "SELECT * FROM amizone.tt_data;")
mydb.commit()
#driver.quit()
print("execution time: %ss" % (round(time.time() - start_time, 5)))
#    time.sleep(10)```

您必须考虑以下几件事:

  • 当您将 pageLoadStrategy 设置为eagerDesiredCapabilities()时,此配置将被烘焙到chromedriver可执行文件中,并将持续到WebDriver实例的生存期。因此,当测试执行正在进行时,您不能将 pageLoadStrategy 从eager更改为normal,反之亦然。

  • 您可以在以下位置找到一些相关的讨论:

    • 在已在运行的硒网络驱动程序上设置功能
    • 更改现有网络驱动程序中的浏览器选项
  • 比较使用页面加载策略的WebDriver变体获得的页面源代码,您将观察到:

    • pageLoadStrategyeager页面源代码不包含 jQuery 和 AJAX cals:

      <script src="/Scripts/jquery.2.1.1.min.js">
      </script>
      <script src="/Scripts/jquery.unobtrusive-ajax.min.js">
      </script>
      
    • 因此,WebDriver变体尝试交互的可能性更高,例如click()send_keys()甚至在JavaScript注册不同的HTML DOM事件(例如事件处理程序(之前,在HTML文档中的元素上,最终将导致click()失败

这就是背后的确切原因...弹出窗口未关闭...


溶液

页面源代码来看,pageLoadStrategy急切,很明显网页上的元素是支持JavaScript的元素,因此更好的方法是在测试执行中使用pageLoadStrategy作为normal

相关内容

最新更新