我已将Selenium WebDriver添加到Powershell并创建WebDriver实例:
Add-Type -path C:\Windows\net40\WebDriver.dll
$driver = New-Object OpenQA.Selenium.Firefox.FirefoxDriver
$driver.Url = "https://www.google.com"
现在我想找到输入字段:
$singleRecord = ($driver.FindElementByCssSelector("input.gbqfif"))
我在C#中找到了几个如何“测试元素是否存在”的例子:
Selenium WebDriver - Test if element is present
Selenium c# Webdriver: Wait Until Element is Present
还有指南here:
IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
{
return d.FindElement(By.Id("someDynamicElement"));
});
但是我无法在Powershell中创建类似的东西,几乎所有的测试都失败了,因为页面加载元素需要时间。
答案 0 :(得分:1)
我不熟悉这个API但是如果你在PowerShell中使用它但在C#中工作时遇到了问题,那么只需创建C#包装器就可以从PowerShell访问所需的功能。您可以使用Add-Type
命令轻松完成此操作。从其文档页面中的第一个示例:
$source = @"
public class BasicTest {
public static int Add(int a, int b) {
return (a + b);
}
public int Multiply(int a, int b) {
return (a * b);
}
}
"@
Add-Type -TypeDefinition $source
[BasicTest]::Add(4, 3)
$basicTestObject = New-Object BasicTest
$basicTestObject.Multiply(5, 2)
当您发现此API的C#代码有效时,您可以将其放入可以从PowerShell调用的C#包装器类中。关键是要避免PowerShell无法像C#静态扩展方法那样处理的功能。
答案 1 :(得分:0)
唯一真正安全的方法是:
static bool isElementPresent(dynamic element, By by)
{
try
{
element.FindElement(by);
return true;
}
catch (NoSuchElementException e)
{
return false;
}
}
此方法同时接受 IWebDriver 或 IWebElement 作为 FindElement()的起点。
所以你可以在 LINQ 查询中使用它:
_infodeskSectionContracts = from contract in
_infodeskSection.FindElements(By.CssSelector(_base + " * ul.list.type-itemlist li"))
select new Contract
{
element = contract.FindElement(By.TagName("a")),
label = contract.FindElement(By.TagName("h4")).Text,
contractNumber = (isElementPresent(contract, By.TagName("p")) ? contract.FindElement(By.TagName("p")).Text : "0000")
};