Я использую -> arrayOfHandles = await page. $ X ({НЕКОТОРЫЕ ВЫРАЖЕНИЯ XPATH}); Чтобы создать массив elementHandles для l oop through и ограничить область видимости в l oop для каждого дескриптора: Но он не работает !!!!!
С учетом следующего фрагмента кода:
<div class="cameraList">
<div class="camera-row">
<div class="statsRow">
<div class="checkbox checkbox-primary">
<input id="Entrance" type="checkbox" readonly="">
</div>
<div class="hasLocationIcon">
<svg version="1.1" id="locationChecked"></svg>
</div>
<div title="Entrance" class="camera-select-box">Entrance</div>
</div>
</div>
<div class="camera-row">
<div class="statsRow">
<div class="checkbox checkbox-primary">
<input id="Camera 3" type="checkbox" readonly="">
</div>
<div class="hasLocationIcon">
<svg version="1.1" id="locationChecked"></svg>
</div>
<div title="Camera 3" class="camera-select-box">Camera 3</div>
</div>
</div>
<div class="camera-row">
<div class="statsRow">
<div class="checkbox checkbox-primary">
<input id="Camera 2" type="checkbox" readonly="">
</div>
<div class="hasLocationIcon">
<svg id="marker-icon"></svg>
</div>
<div title="Camera 2" class="camera-select-box">Camera 2</div>
</div>
</div>
<div class="camera-row">
<div class="statsRow">
<div class="checkbox checkbox-primary">
<input id="Sky Cam" type="checkbox" readonly="">
</div>
<div class="hasLocationIcon">
<svg version="1.1" id="locationChecked"></svg>
</div>
<div title="Sky Cam" class="camera-select-box">Sky Cam</div>
</div>
</div>
</div>
Каждый раз, когда страница загружается, список камер отличается. иногда больше или меньше камер. Иногда svg id = "marker-icon", что означает отсутствие доступного местоположения.
Мне нужно собрать список камер и установить только флажки для тех, у которых есть местоположения. Вот что у меня есть:
const cameraRowList = await page.$x("//div[contains(@class, 'camera-row')]"); // returns an array of elementHandles
for (const cameraRow of cameraRowList) {
// loop through the list of elementHandles and click the ones that have locations
const [cameraHasLocation] = await cameraRow.$x("//div[@class='statsRow']//div[@class='hasLocationIcon']//*[@id='locationChecked']");
if (cameraHasLocation) {
const [cameraSelectBox] = await cameraRow.$x("//div[contains(@class, 'checkbox')]");
await cameraSelectBox.click();
}
}
Несмотря на то, что он просматривает список ожидаемое количество раз (говорит мне, что находит и создает массив строк камеры), он всегда нажимает только на первую в списке. Кроме того, в ряду, у которого его нет, следует его пропустить, но это не так. Мне кажется, что объем не работает, и он все еще выполняет проверки на основе "страницы"