【selenium】使用笔记

driver.findElementByXPath(“a”).click()和action.click(driver.findElementByXPath( “a”));的区别?

都可以用来模拟点击页面上的元素,实现方式略有不同:
1、driver.findElementByXPath(“a”).click()使用的是Selenium的默认click()方法,它直接在定位到的元素上执行单击操作,没有使用其他的用户输入事件(如鼠标悬停、按下或释放按键等)。这种方式适用于大多数情况下,特别是当您只需要单击元素时。

2、而action.click(driver.findElementByXPath(“a”))使用的是Selenium的Actions类,这个类提供了一种更加灵活的方式来模拟用户的输入事件。在这个例子中,action.click()方法使用了鼠标操作来单击元素,这意味着它会首先悬停在该元素上,然后按下鼠标左键,最后释放鼠标左键。这种方式可以用于一些比较特殊的场景,例如需要模拟鼠标悬停或按下按键的情况。

因此,driver.findElementByXPath(“a”).click()和action.click(driver.findElementByXPath(“a”))在大多数情况下都是等效的,但是当您需要更加灵活地控制用户输入事件时,Actions类提供了更好的选择。

driver.switchTo().defaultContent()

用于将当前驱动程序的焦点切换回主窗口(即当前窗口的最高层级)。

当使用Selenium WebDriver执行测试时,通常会打开多个窗口或iframe。当焦点在iframe或子窗口中时,您需要使用switchTo()方法将焦点切换回主窗口,以便您可以与主窗口中的元素进行交互。

defaultContent()方法将当前的驱动程序焦点切换回到主窗口。如果您之前已经使用switchTo().frame()方法进入一个iframe或子窗口,那么此时将退出iframe或子窗口,返回到主窗口。如果您之前没有进入过iframe或子窗口,此方法将不起作用。

总之,driver.switchTo().defaultContent()方法是将焦点切换回主窗口的一种简便方法,用于确保您可以正确地与主窗口中的元素进行交互。

driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);

用于设置全局隐式等待时间。

隐式等待是一种设置等待时间的方式,它会在查找元素时等待一定的时间(例如,在调用findElement()或findElements()方法时),如果在指定的时间内没有找到元素,则会抛出NoSuchElementException异常。这是一种全局设置,适用于整个测试脚本,对所有findElement()或findElements()方法都有效。

在上述示例中,driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS)将全局隐式等待时间设置为1秒钟。这意味着,如果在查找元素时,Selenium WebDriver没有在1秒钟内找到该元素,则会抛出NoSuchElementException异常。

需要注意的是,隐式等待不是精确定时的,即它不会严格等待指定的时间,而是在指定的时间内轮询查找元素。这可能会导致某些性能问题,因为它会增加测试的执行时间。

//设置轮询
int times = 15;
do {
    //每次等待1s
    driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
} while (times -- > 0 && driver.getTitle().indexOf("title名") == -1);
if (times <= 0) {
    throw new AKException("错误信息");
 }          
 
//上述代码优化为显式等待
WebDriverWait wait = new WebDriverWait(driver, 15); // 等待时间为 15 秒
wait.until(ExpectedConditions.titleContains("Login_wx"));

总之,方法是设置全局隐式等待时间的一种方式,用于确保在查找元素时等待一定的时间,以确保元素可用。

若页面元素很多,怎么尽量确保所有元素都会被依次找到,而非因为页面卡顿等问题导致元素找不到而报错

1、使用合适的等待方法:在查找元素时,可以使用显示等待或隐式等待方法,以等待元素的出现。显示等待可以更精确地等待特定元素的出现,而隐式等待可以全局性地等待所有元素。这样可以在一定程度上避免元素找不到的情况。

2、分步骤查找元素:如果元素很多,可以尝试分步骤查找元素。例如,可以首先查找页面中的一组元素,然后在该组元素中逐个查找特定的元素。这样可以避免一次性查找过多元素的问题,也可以更好地处理页面卡顿等情况。

3、避免频繁刷新页面:如果元素很多或者页面卡顿,可能会频繁刷新页面,这会增加查找元素的难度,也会浪费时间和资源。因此,应该尽量避免频繁刷新页面,而是尝试使用其他方法来处理页面卡顿等问题。

4、使用日志和异常处理:在处理元素时,可以在代码中添加日志和异常处理机制,以记录程序的执行过程和发现的问题,并及时处理异常情况。这样可以帮助排查程序出现的问题,并尽量确保所有元素都能被正确地找到。

操作下拉框

public static void main(String[] args) throws Exception {
		// 指定浏览器驱动
		System.setProperty("webdriver.chrome.driver", "webdriver/chromedriver.exe");
		// 实例化浏览器
		WebDriver driver=new ChromeDriver();
		// 打开网页,窗口最大化
		driver.get("file:///C:/Users/Archforce/Desktop/%E4%B8%8B%E6%8B%89%E6%A1%86%E7%BB%83%E4%B9%A0.html");
		driver.manage().window().maximize();
		// 定位select标签下拉框
		WebElement ele=driver.findElement(By.id("poet"));
		// 实例化select方法
		Select select_ele=new Select(ele);
		// 通过select索引定位选择下拉框元素,注意索引从0开始
		select_ele.selectByIndex(下标索引);
		Thread.sleep(1000);
        // 通过select的value定位选择下拉框元素
		select_ele.selectByValue("value值");
		Thread.sleep(1000);
		// 通过select的文本内容定位选择下拉框元素
		select_ele.selectByVisibleText("下拉文本");
		Thread.sleep(1000);
		driver.quit();
	}

WebElement selector = driver.findElement(By.id(“dt_hjhf”));

new Select(selector).selectByVisibleText(“a”);

如果下拉中匹配不到程序会报错

在这种情况下,可以使用selectByValue或selectByIndex方法来选择下拉框中的选项。
1、selectByValue方法接受一个字符串参数,可以使用选项的value属性的值作为参数进行选择。如果下拉框中没有指定的选项,也不会抛出异常,只是不会选择任何选项而已。
2、而selectByIndex方法接受一个整数参数,可以使用选项在下拉框中的索引作为参数进行选择。

ExpectedConditions.elementToBeClickable是

Selenium的一个内置等待条件,它会等待一个元素可被点击,也就是在元素处于可见、存在、启用、没有被覆盖并且大小大于0的情况下等待元素能够被点击。如果在规定的等待时间内元素不可被点击,就会抛出TimeoutException异常。这个条件可以用于等待页面加载完成或等待一个元素的状态变为可点击。

new Select(driver.findElement(By.id(“dt_zjlx”))).selectByValue(“q”);没有匹配到q会报错

可能是因为该下拉框中没有对应的选项值就会报错。可以先打印出该下拉框中的所有选项,看看是否有 q 这个选项值。
例如,可以使用以下代码获取下拉框中的所有选项:

Select select = new Select(driver.findElement(By.id("dt_zjlx")));
List<WebElement> options = select.getOptions();
for (WebElement option : options) {
    System.out.println(option.getAttribute("value"));
}

执行后会输出该下拉框中所有选项的值。

stale element reference: element is not attached to the page document

"Stale element reference"错误通常表示在尝试访问已经被销毁或不再可用的Web元素。这通常发生在以下情况下:

1、页面发生了刷新或导航,导致元素被销毁。
2、在元素被加载后,通过JavaScript或其他方法对页面进行了更改,导致元素不再存在于DOM中。
3、在元素被加载后,通过其他方式对页面进行了更改,导致元素不再存在于DOM中。
要解决此问题,可以尝试重新加载页面或等待元素重新加载。您可以尝试以下方法:

使用显式等待以确保元素已完全加载并附加到页面上,例如:

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("your_element_id")));

确保在对元素进行操作之前,检查该元素是否存在于DOM中。如果不存在,您可以重新加载页面或采取其他行动来确保元素可用。
如果页面已经刷新或导航,则需要重新获取元素的引用。

注意:如果您已经尝试了这些方法但仍然无法解决问题,则可能需要重新设计您的测试用例或重新审查您的测试代码,以确保正确地处理元素的存在和可用性。

页面弹窗关闭之后获取不到后续元素的原因

可能是因为页面刷新或元素发生了变化,导致之前获取的元素失效。另外,如果弹窗是一个新打开的窗口,需要先切换到该窗口才能获取其中的元素。可以通过以下步骤解决问题:

等待页面弹窗出现并关闭,可以使用WebDriverWait等待页面元素出现,或者使用Thread.sleep()等待一定时间。
等待页面刷新或元素变化完成,同样可以使用WebDriverWait等待页面元素出现,或者使用Thread.sleep()等待一定时间。
切换到正确的窗口,如果弹窗是一个新的窗口,需要使用driver.getWindowHandles()获取所有窗口句柄,然后使用driver.switchTo().window(handle)切换到正确的窗口。
再次尝试获取需要的元素。如果元素还是无法获取,可能需要检查元素是否正确的定位,或者是否需要滚动页面等操作。

页面弹窗是个新窗口,关闭之后页面刷新了怎么获取后续元素

如果页面弹窗是一个新窗口,并且关闭后页面刷新了,那么获取后续元素的方式和正常页面刷新后获取元素的方式是一样的。也就是说,需要重新获取页面上的元素,并使用WebDriverWait等待元素加载完全后进行后续操作。可以考虑使用以下方法:

获取当前窗口的句柄
在进行窗口切换操作前,需要获取当前窗口的句柄,可以使用以下代码获取:

String currentHandle = driver.getWindowHandle();

切换到主窗口
在关闭弹窗并刷新页面后,需要切换回主窗口,可以使用以下代码实现:

driver.switchTo().window(currentHandle);

获取后续元素并等待元素加载
切换回主窗口后,可以重新获取需要操作的元素,并使用WebDriverWait等待元素加载完全后进行后续操作。可以使用以下代码获取元素并等待元素加载:

WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("your_element_id")));

注意,如果页面刷新后原先获取的元素已经不存在了,需要重新获取元素。在获取元素前最好等待一段时间,确保页面已经加载完成。

action.sendKeys(element, value).perform();和element.sendKeys(value);

这两行代码都是用于向页面元素发送键盘输入的操作,但是它们的使用方式和场景有所不同:

1、action.sendKeys(element, value).perform(); 是使用 Selenium WebDriver 中的 Actions 类,通过 sendKeys() 方法向指定的页面元素 element 发送键盘输入 value。Actions 类提供了更加灵活的操作方式,可以进行多个动作的组合,如模拟鼠标的点击、拖拽等操作。它通常用于模拟更加复杂的用户行为或者对多个元素进行操作的情况。
2、而 element.sendKeys(value); 则是直接使用页面元素对象 element 的 sendKeys() 方法向页面元素发送键盘输入 value。这种方式简单直接,通常用于单个元素的操作,如在表单中输入文本等。

需要注意的是,两种方式都可以向页面元素发送键盘输入,但是它们的使用场景不同。如果需要进行更加复杂的用户行为模拟,可以使用 Actions 类;如果只需要简单地向一个页面元素发送键盘输入,直接使用元素对象的 sendKeys() 方法就可以了。

BufferedImage getSubimage (int x, int y, int w, int h)

用于从源图像中获取指定位置和大小的子图像,返回一个新的 BufferedImage 对象。该方法接受四个参数:
x:子图像左上角的 X 坐标。
y:子图像左上角的 Y 坐标。
w:子图像的宽度。
h:子图像的高度。
该方法将返回一个新的 BufferedImage 对象,其源图像为当前 BufferedImage 对象,并裁剪到指定的位置和大小。注意,这个方法只是在源图像上创建一个新的视图,而不会复制源图像的像素数据。如果在返回的子图像中修改像素,则也会影响原始图像。因此,修改返回的子图像可能会影响其他使用源图像的代码。

File src = driver.getScreenshotAs(OutputType.FILE);

这段代码使用getScreenshotAs方法从driver中获取当前页面的截图。OutputType.FILE参数表示以文件形式获取全屏截图,即将截图保存到本地文件中。返回的类型是File。

int width = element.getSize().getWidth();

        int height = element.getSize().getHeight();
        Point point = element.getLocation();
        int x = point.getX();
        int y = point.getY();看一下如上代码 

这段代码是用Java编写的,用于获取Web页面上元素的大小和位置信息。

以下是每行代码的解释:

int width = element.getSize().getWidth();: 获取元素的宽度并将其存储在名为width的整数变量中。
int height = element.getSize().getHeight();: 获取元素的高度并将其存储在名为height的整数变量中。
Point point = element.getLocation();: 获取元素在页面上的坐标位置并将其存储在名为point的Point对象中。
int x = point.getX();: 从Point对象中获取元素的X轴坐标位置并将其存储在名为x的整数变量中。
int y = point.getY();: 从Point对象中获取元素的Y轴坐标位置并将其存储在名为y的整数变量中。

怎么根据id查出页面某下拉框的所有的option放到一个集合里面

可以使用 Select 类来处理下拉框,它提供了一些方便的方法来选择下拉框中的选项。

首先,需要通过 WebDriver 对象的 findElement 方法找到下拉框元素,然后创建一个 Select 对象来进行下拉框操作。
例如,如果下拉框的 HTML 代码如下:

<select id="dropdown">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>

那么可以使用以下代码来获取所有选项:

WebElement dropdown = driver.findElement(By.id("dropdown"));
Select select = new Select(dropdown);
List<WebElement> options = select.getOptions();

在这个代码片段中,driver.findElement 方法返回的是一个 WebElement 对象,代表了下拉框元素。然后通过 new Select(dropdown) 创建一个 Select 对象,之后可以通过 select.getOptions() 方法获取下拉框中所有的选项,返回的是一个 List 集合,每个元素代表了一个选项。

获取选项之后,可以通过循环遍历集合来进行后续操作,例如获取选项的文本和值等等。
注意:在使用 Select 类之前,需要确保下拉框元素是一个 标签,并且该元素上必须有 id 或 name 属性。

invalid argument: uniqueContextId not found

这个错误通常是由于在使用 Selenium WebDriver 时,网页的 JavaScript 脚本与 WebDriver 调用之间发生了某种类型的竞争条件导致的。这通常是在使用多线程环境或异步 JavaScript 代码时发生的。在使用 WebDriver 时,应遵循以下最佳实践,以尽可能地减少此类错误的发生:

避免多线程环境:在使用 WebDriver 时,应尽量避免在多个线程中使用同一个 WebDriver 实例。每个线程都应该有自己的 WebDriver 实例,以便彼此独立地执行操作。

显式等待:在使用 WebDriver 时,应尽可能地使用显式等待来确保页面元素在执行操作之前已经完全加载和渲染。这可以通过使用 WebDriverWait 类来实现。在等待页面元素时,最好使用合适的条件,例如 visibilityOfElementLocated 或 elementToBeClickable。

避免复杂的 JavaScript:在使用 WebDriver 时,应尽可能地避免使用复杂的 JavaScript 代码或异步 JavaScript 代码。这些代码可能会与 WebDriver 调用之间产生竞争条件,从而导致错误。

测试环境准备:在使用 WebDriver 时,应尽可能地准备好测试环境。这包括确保测试用例中的每个元素都可以正确加载和渲染,并且测试用例中使用的所有 JavaScript 代码都正确执行。如果测试环境不正确,则可能会导致 WebDriver 出现错误。

action.clickAndHold(scrollBar).moveByOffset(0, 200).release().perform();

1、clickAndHold(scrollBar):模拟鼠标在取名为scrollBar的元素上点击并保持鼠标按钮。
2、moveByOffset(0, 200):模拟鼠标从当前位置向下移动 200 个像素,实际上是模拟滚动条的拖动。
moveByOffset(0, -200):向上移动;
moveByOffset(200, 0):向右移动;
moveByOffset(-200, 0):向左移动。
3、release():释放鼠标按钮,完成操作(不使用的话鼠标会一直保持按下状态)。
4、perform():执行整个操作序列。

这段代码可以用于模拟滚动条的拖动,以滚动网页内容。

findElementByAccessibilityId和findElementById

1、findElementByAccessibilityId:主要用于移动应用测试。
2、findElementById:主要用于网页应用程序测试,特别是在浏览器中。

driver.manage()

用于管理浏览器的设置和属性的对象,可以访问并管理不同方面的浏览器设置,如窗口大小、浏览器缓存、超时等等。
1、window():
用于管理浏览器窗口的设置,包括最大化窗口、设置窗口大小、设置窗口位置等。

driver.manage().window().maximize(); // 最大化浏览器窗口
driver.manage().window().setSize(new Dimension(1024, 768)); // 设置窗口大小

2、timeouts():
用于管理各种超时设置,如页面加载超时、异步脚本超时、等待元素可见超时等。

driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); // 设置页面加载超时时间为30秒
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); // 设置隐式等待时间为10秒

3、logs():
用于管理浏览器日志记录,你可以使用这个方法来获取浏览器的各种日志,如控制台日志、网络日志等。

LogEntries logs = driver.manage().logs().get(LogType.BROWSER); // 获取浏览器控制台日志

4、deleteAllCookies():
用于删除浏览器中的所有 Cookies。

driver.manage().deleteAllCookies(); // 删除浏览器中的所有 Cookies
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值