如何从浏览器测试中检索 Ping 下载和上传时间?
How to retrieve the Ping Download and Upload time from browser tests?
我正在尝试使用不同的浏览器自动实现 speedtests 自动化,测试的主要部分在一个循环中。问题是,有时,一个元素之前已经 selected,并且脚本在接下来的步骤之一中正确运行,完全在同一循环和同一页面,但编号不同,没有xpath 中的任何更改,selenium 都无法再次 select 它。所以,我不能随心所欲地重复我的测试。
大多数时候我在使用 Edge 时遇到这个问题,我认为原因之一可能是我在 Chrome 或 Firefox 的帮助下找到的元素的 xpath。 (我首先在 Edge 中找不到 xpath,我搜索了很多)。
我也放了我用的不同的xpath。其实我想获取ping、下载、上传位置和服务器的数值或字符串值。
请告诉我,我该如何解决这个问题,我尝试了不同的睡眠时间和两个不同的 xpath。当我尝试 select 带有 class_name 或 css_selector 的元素时,脚本总是给我错误。
火狐:
"/html/body/div[3]/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/span"
chrome:
"//[@id='container']/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/span"
chrome:
"//div[@class='result-item result-item-ping updated']/div[2]/span"
另一个问题是如何等待页面完全加载。这种方法 WebDriverWait(driver,some seconds)
对我不起作用,我必须使用 time.sleep()
错误:
selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素
element = driver.find_element_by_xpath("/html/body/div[3]/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/span")
使用以下 CSS 定位符来识别值:
下载:*.result-data-large.number.result-data-value.download-speed*
上传:*.result-data-large.number.result-data-value.upload-speed*
平:*.result-data-large.number.result-data-value.ping-speed*
利用getText()
,您可以检索它们的值。等待页面中的某个元素可见,以确保页面加载成功。
试试:element = driver.find_element_by_xpath("/html/body/div[3]/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/")
也许您还需要捕获异常:NoSuchElementException
个案例。
我已经测试了这些 CSS 选择器,它们在 Chrome 和 Edge 中都有效。
span.ping-speed # ping
span.download-speed # download
span.upload-speed # upload
div.server-current > div.result-label # server
如果您想知道页面何时完成加载,可以等到 URL 从 https://www.speedtest.net
变为 https://www.speedtest.net/results/<some number>
。我只会使用 WebDriverWait
和 url_contains("results")
,例如
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 10).until(EC.url_contains("results"))
中还有一些其他方法。
要使速度测试自动化,您可以使用以下解决方案:
代码块:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Edge(executable_path=r'C:\WebDrivers\MicrosoftWebDriver.exe')
driver.get("https://www.speedtest.net/")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.js-start-test.test-mode-multi"))).click()
WebDriverWait(driver, 45).until(EC.url_contains("result"))
print("Ping :"+driver.find_element_by_css_selector("div[title='Reaction Time'] div.result-data.u-align-left>span").get_attribute("innerHTML"))
print("Download: "+driver.find_element_by_css_selector("div[title='Receiving Time'] div.result-data.u-align-left>span").get_attribute("innerHTML"))
print("Upload :"+driver.find_element_by_css_selector("div[title='Sending Time'] div.result-data.u-align-left>span").get_attribute("innerHTML"))
#driver.quit()
控制台输出:
Ping :35
Download: 21.53
Upload :3.46
浏览器快照:
WebDriverWait driverWait = new WebDriverWait(driver, 30000);
driver.get("https://www.speedtest.net/");
WebElement goLink = driver.findElement(By.cssSelector(".js-start-test.test-mode-multi"));
driverWait.until(ExpectedConditions.elementToBeClickable(goLink));
goLink.click();
By download = By.cssSelector(".result-data-large.number.result-data-value.download-speed");
By upload = By.cssSelector(".result-data-large.number.result-data-value.upload-speed");
By ping = By.cssSelector(".result-data-large.number.result-data-value.ping-speed");
driverWait.until(ExpectedConditions.urlMatches("https://www.speedtest.net/result/[0-9]"));
String downloadSpeed = driver.findElement(download).getText();
String uploadSpeed = driver.findElement(upload).getText();
String pingValue = driver.findElement(ping).getText();
System.out.println("Download: "+downloadSpeed + "\nUpload: "+ uploadSpeed + "\n Ping: "+pingValue);
输出
下载:78.82
上传:45.93
平安:23
我正在尝试使用不同的浏览器自动实现 speedtests 自动化,测试的主要部分在一个循环中。问题是,有时,一个元素之前已经 selected,并且脚本在接下来的步骤之一中正确运行,完全在同一循环和同一页面,但编号不同,没有xpath 中的任何更改,selenium 都无法再次 select 它。所以,我不能随心所欲地重复我的测试。
大多数时候我在使用 Edge 时遇到这个问题,我认为原因之一可能是我在 Chrome 或 Firefox 的帮助下找到的元素的 xpath。 (我首先在 Edge 中找不到 xpath,我搜索了很多)。
我也放了我用的不同的xpath。其实我想获取ping、下载、上传位置和服务器的数值或字符串值。
请告诉我,我该如何解决这个问题,我尝试了不同的睡眠时间和两个不同的 xpath。当我尝试 select 带有 class_name 或 css_selector 的元素时,脚本总是给我错误。
火狐:
"/html/body/div[3]/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/span"
chrome:
"//[@id='container']/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/span"
chrome:
"//div[@class='result-item result-item-ping updated']/div[2]/span"
另一个问题是如何等待页面完全加载。这种方法 WebDriverWait(driver,some seconds)
对我不起作用,我必须使用 time.sleep()
错误: selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素
element = driver.find_element_by_xpath("/html/body/div[3]/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/span")
使用以下 CSS 定位符来识别值:
下载:*.result-data-large.number.result-data-value.download-speed*
上传:*.result-data-large.number.result-data-value.upload-speed*
平:*.result-data-large.number.result-data-value.ping-speed*
利用getText()
,您可以检索它们的值。等待页面中的某个元素可见,以确保页面加载成功。
试试:element = driver.find_element_by_xpath("/html/body/div[3]/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/")
也许您还需要捕获异常:NoSuchElementException
个案例。
我已经测试了这些 CSS 选择器,它们在 Chrome 和 Edge 中都有效。
span.ping-speed # ping
span.download-speed # download
span.upload-speed # upload
div.server-current > div.result-label # server
如果您想知道页面何时完成加载,可以等到 URL 从 https://www.speedtest.net
变为 https://www.speedtest.net/results/<some number>
。我只会使用 WebDriverWait
和 url_contains("results")
,例如
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 10).until(EC.url_contains("results"))
要使速度测试自动化,您可以使用以下解决方案:
代码块:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Edge(executable_path=r'C:\WebDrivers\MicrosoftWebDriver.exe') driver.get("https://www.speedtest.net/") WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.js-start-test.test-mode-multi"))).click() WebDriverWait(driver, 45).until(EC.url_contains("result")) print("Ping :"+driver.find_element_by_css_selector("div[title='Reaction Time'] div.result-data.u-align-left>span").get_attribute("innerHTML")) print("Download: "+driver.find_element_by_css_selector("div[title='Receiving Time'] div.result-data.u-align-left>span").get_attribute("innerHTML")) print("Upload :"+driver.find_element_by_css_selector("div[title='Sending Time'] div.result-data.u-align-left>span").get_attribute("innerHTML")) #driver.quit()
控制台输出:
Ping :35 Download: 21.53 Upload :3.46
浏览器快照:
WebDriverWait driverWait = new WebDriverWait(driver, 30000);
driver.get("https://www.speedtest.net/");
WebElement goLink = driver.findElement(By.cssSelector(".js-start-test.test-mode-multi"));
driverWait.until(ExpectedConditions.elementToBeClickable(goLink));
goLink.click();
By download = By.cssSelector(".result-data-large.number.result-data-value.download-speed");
By upload = By.cssSelector(".result-data-large.number.result-data-value.upload-speed");
By ping = By.cssSelector(".result-data-large.number.result-data-value.ping-speed");
driverWait.until(ExpectedConditions.urlMatches("https://www.speedtest.net/result/[0-9]"));
String downloadSpeed = driver.findElement(download).getText();
String uploadSpeed = driver.findElement(upload).getText();
String pingValue = driver.findElement(ping).getText();
System.out.println("Download: "+downloadSpeed + "\nUpload: "+ uploadSpeed + "\n Ping: "+pingValue);
输出 下载:78.82 上传:45.93 平安:23